我有一个dataframe df_in
so:
import pandas as pd
import numpy as np
dic_in = {'A':['A1','A1','A1','L3','A3','A3','B1','B1','B1','B2','A2'],
'B':['xxx','ttt','qqq','nnn','lll','nnn','eee','xxx','qqq','bbb','sss'],
'C':['fas','efe','pfo','scs','grj','rpo','cbb','asf','asc','wq3','mls']}
df_in = pd.DataFrame(dic_in)
我也有另一个数据框,称为 df_map
:
dic_map = {'X':['A1' ,'A1' ,'A1' ,'A2' ,'A3' ,'B1' ,'B1' ,'B1' ,'B1' ,'B2' ,'B3' ,'B3' ,'L1', 'L3' ,'L3'],
'Y':['qqq','ttt','xxx','sss','lll','eee','qqq','xxx','zzz','bbb','mmm','ooo','kkk','nnn','ttt']}
df_map = pd.DataFrame(dic_map)
我的目标是研究df_in
的每个row[['A','B']]
;如果在df_map
中标识了这两个项目,则我提取相应索引的值,然后将其设置为第一个dataframe中的另一列。
ex:这对A1 - xxx
在0
中的地图中找到;因此,我将在夫妻A1 - xxx
旁边放置一个0
。如果找不到一对夫妇,那么我将放置NaN
。
结果应该像这样:
Idx A B C
0 2 A1 xxx fas
1 1 A1 ttt efe
2 0 A1 qqq pfo
3 13 L3 nnn scs
4 4 A3 lll grj
5 NaN A3 nnn rpo
6 5 B1 eee cbb
7 7 B1 xxx asf
8 6 B1 qqq asc
9 9 B2 bbb wq3
10 3 A2 sss mls
您能建议我一种实现目标的明智而有效的方法吗?
您可以将merge
与reset_index
一起使用,最后删除drop
的列:
print (pd.merge(df_in,
df_map.reset_index(),
left_on=['A','B'],
right_on=['X','Y'],
how='left').drop(['X','Y'], axis=1))
A B C index
0 A1 xxx fas 2.0
1 A1 ttt efe 1.0
2 A1 qqq pfo 0.0
3 L3 nnn scs 13.0
4 A3 lll grj 4.0
5 A3 nnn rpo NaN
6 B1 eee cbb 5.0
7 B1 xxx asf 7.0
8 B1 qqq asc 6.0
9 B2 bbb wq3 9.0
10 A2 sss mls 3.0
另一种解决方案,谢谢Julien Marrec:
df_in.merge(df_map.reset_index()
.set_index(['X','Y']),
left_on=['A','B'],
right_index=True,
how='left')
最后,如果需要,列的更改顺序:
df = pd.merge(df_in,
df_map.reset_index(),
left_on=['A','B'],
right_on=['X','Y'],
how='left').drop(['X','Y'], axis=1)
cols = df.columns[-1:].tolist() + df.columns[:-1].tolist()
print (cols)
['index', 'A', 'B', 'C']
df = df[cols]
print (df)
index A B C
0 2.0 A1 xxx fas
1 1.0 A1 ttt efe
2 0.0 A1 qqq pfo
3 13.0 L3 nnn scs
4 4.0 A3 lll grj
5 NaN A3 nnn rpo
6 5.0 B1 eee cbb
7 7.0 B1 xxx asf
8 6.0 B1 qqq asc
9 9.0 B2 bbb wq3
10 3.0 A2 sss mls