Как отобразить один фрейм данных в другой (python pandas)? - PullRequest
4 голосов
/ 10 июля 2019

Учитывая эти два кадра данных, как получить предполагаемый выходной кадр данных?Долгий путь состоял бы в том, чтобы циклически проходить по строкам кадра данных с iloc, а затем использовать функцию map после преобразования df2 в dict, чтобы сопоставить x и y с их счетом.

Это кажется утомительным и заняло бы много времени, чтобы работать на большом кадре данных.Я надеюсь, что есть более чистое решение.

df1:

ID    A    B    C
1     x    x    y
2     y    x    y
3     x    y    y

df2:

ID    score_x    score_y
1          20         30
2          15         17
3          18         22

вывод:

ID    A     B     C
1     20    20    30
2     17    15    17
3     18    22    22

Примечание:у фреймов данных будет много столбцов, и в качестве категорий будет больше, чем просто x и y (возможно, в области из 20 категорий).

Спасибо!

Ответы [ 3 ]

8 голосов
/ 10 июля 2019

Используйте DataFrame.apply вдоль столбцов с Series.map:

df1.set_index('ID', inplace=True)
df2.set_index('ID', inplace=True)
df2.columns = df2.columns.str.split('_').str[-1]

df1 = df1.apply(lambda x: x.map(df2.loc[x.name]), axis=1).reset_index()

print(df1)
   ID   A   B   C
0   1  20  20  30
1   2  17  15  17
2   3  18  22  22

print(df2)
     x   y
ID        
1   20  30
2   15  17
3   18  22
4 голосов
/ 10 июля 2019

Использование mask :

df1.set_index('ID', inplace=True)
df2.set_index('ID', inplace=True)

df1.mask(df1=='x',df2['score_x'],axis=0).mask(df1=='y',df2['score_y'],axis=0)

Результат:

     A   B   C
ID            
1   20  20  30
2   17  15  17
3   18  22  22

Если столбцов много, и все они названы одинаково, вы можете использоватьчто-то в этом роде:

for e in df2.columns.str.split('_').str[-1]:
     df1.mask(df1==e, df2['score_'+e], axis=0, inplace=True)
0 голосов
/ 10 июля 2019

Для этого может быть более элегантный способ, но при условии, что вы можете перечислять по категориям и столбцам:

import numpy as np

df3 = df1.set_index('ID').join(df2.set_index('ID'), on='ID')
for col in ['A','B','C']:
     for type in ['x','y']:
         df3[col] = np.where(df3[col] == type, df3['score_'+type], df3[col])


>>> df3
     A   B   C  score_x  score_y
ID
1   20  20  30       20       30
2   17  15  17       15       17
3   18  22  22       18       22
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...