Как получить столбцы панд в строках с пользовательским условием? - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть такие кадры

df1

  A   B   C      SN
0  10  23  48  456123
1  15  45  98  789456
2  16  62  55  123789

df2

    A   B     C      SN
0  10  19  48.0  456123
1  15  45   NaN  789456
2  68  77  55.0  123789

Мне нужно что-то вроде ниже

SN   123789  456123  789456
A_x    16    10    15
B_x    62    23    45
C_x    55    48    98
A_y    68    10    15
B_y    77    19    45
C_y    55    48     0

Я пытался использовать pandas groupby и pivot, но не работал так, как хотел. Любая помощь?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Используйте merge с заменой 0 на fillna, при необходимости sort_index и trne транспонируйте на set_index с T:

#if need inner join
df3 = dfa.merge(df2,on='SN').fillna(0).sort_index().set_index('SN').T
#if need outer join
df3 = dfa.merge(df2,on='SN', how='outer').fillna(0).sort_index().set_index('SN').T
print (df3)
SN   456123  789456  123789
A_x    10.0    15.0    16.0
B_x    23.0    45.0    62.0
C_x    48.0    98.0    55.0
A_y    10.0    15.0    68.0
B_y    19.0    45.0    77.0
C_y    48.0     0.0    55.0

Другое решение с внешним соединением с concat:

df3 = (pd.concat([df1.set_index('SN'), 
                  df2.set_index('SN')], axis=1, keys=('x', 'y')).T.fillna(0))

#flatten MultiIndex
df3.index = [f'{j}_{i}' for i, j in df3.index]
print (df3)
SN   456123  789456  123789
A_x    10.0    15.0    16.0
B_x    23.0    45.0    62.0
C_x    48.0    98.0    55.0
A_y    10.0    15.0    68.0
B_y    19.0    45.0    77.0
C_y    48.0     0.0    55.0
0 голосов
/ 14 сентября 2018

Вы можете сделать что-то подобное ниже.

output = pd.merge(df1,df2,on='SN').groupby(['SN']).sum().transpose()

выход:

    SN   123789  456123  789456
A_x    16.0    10.0    15.0
B_x    62.0    23.0    45.0
C_x    55.0    48.0    98.0
A_y    68.0    10.0    15.0
B_y    77.0    19.0    45.0
C_y    55.0    48.0     0.0

Позже вы можете изменить тип на int с float.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...