Python Pandas неравное соединение - PullRequest
0 голосов
/ 29 февраля 2020

Иметь таблицу

import pandas as pd
import numpy as np

list_1=[['Steven',np.nan,'C1'],
        ['Michael',np.nan,'C2'],
        ['Robert',np.nan,'C3'],
        ['Buchanan',np.nan,'C1'],
        ['Suyama',np.nan,'C2'],
        ['King',np.nan,'C3']]
labels=['first_name','last_name','class']
df=pd.DataFrame(list_1,columns=labels)
df

OUT

    first_name  last_name   class
0   Steven       NaN         C1
1   Michael      NaN         C2
2   Robert       NaN         C3
3   Buchanan     NaN         C1
4   Suyama       NaN         C2
5   King         NaN         C3

Потребность:

first_name  last_name
Steven       Buchanan
Michael      Suyama
Robert       King

, поэтому мне нужно сделать неравный эквивалент объединения SQL запрос:

;with cte as
(
SELECT first_name,
        class,
        ROW_NUMBER() OVER (partition by class ORDER BY first_name) as rn
FROM students
)
select c_fn.first_name,
        c_ln.first_name
from cte c_fn join cte c_ln on c_fn.class=c_ln.class and c_ln.rn< c_fn.rn

или как SQL запрос:

;with cte as
(
SELECT first_name,
        last_name,
        ROW_NUMBER() OVER ( ORDER BY (select null)) as rn
FROM students
)
select fn.first_name,
        ln.first_name as last_name
from cte fn join cte ln on ln.rn=fn.rn+3

Проблема в PANDAS заключается в том, что NON EQUAL SELF JOIN нельзя выполнить с помощью MERGE. И я не могу найти другой путь .....

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Мы можем решить эту проблему в pandas более разумным способом, используя groupby с agg и соединяя строки. Затем мы split их в столбцы:

dfn = df.groupby('class').agg(' '.join)['first_name'].str.split(' ', expand=True)
dfn.columns = [df.columns[:2]]
dfn = dfn.reset_index(drop=True)

  first_name last_name
0     Steven  Buchanan
1    Michael    Suyama
2     Robert      King
0 голосов
/ 29 февраля 2020

Вы можете установить индекс на «класс» и выбрать отдельные имена:

df = df.setIndex('class')
first_name = df.loc["C1", "first_name"].values[0]
last_name = df.loc["C1", "last_name"].values[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...