我有一个名为df_in
的数据框,格式如下:
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
中被识别,则我将提取相应索引的值,并将其设置到第一个数据框的另一列中。例如:假设在
0
中找到了一对A1-xxx
,那么我将在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
你能给我建议一个聪明高效的方式来达到我的目标吗?
df_in.merge(df_map.reset_index().set_index(['X','Y']), left_on=['A','B'], right_index=True, how='left')
。 - Julien Marrecdf['index'] += 1
吗? - Julien Marrecshifted = df_map.reset_index()
然后进行移位操作shifted['index'] = shifted['index'].shift()
,最后执行合并操作df = pd.merge(df_in, shifted, left_on=['A','B'], right_on=['X','Y'], how='left').drop(['X','Y'], axis=1)
? - jezraelmerge not
,但在它之前或之后也是可能的。之前可以像这样:shifted = df_map.reset_index()
shifted['index'] += 1
,之后同样的方式。 - jezrael