1 回答
TA贡献1891条经验 获得超3个赞
95% 的时间你可以使用 pandas 向量化方法并消除循环的需要。在这种情况下,您可以只使用pd.merge
一个简单、干净且高效的方法来替代长循环。
编辑:(答案#1):实际上,您可以进行更高级的合并,left_on=dfA.index, right_on='context'
并在合并后与其他清理操作一起在一行中执行此操作,但请参阅下面更完整的答案,它采用类似的方法:
df = (pd.merge(dfA, dfB['context'], how='left', left_on=dfA.index, right_on='context') .drop_duplicates() .dropna(subset=['Name']) .drop('context', axis=1) .rename({'context_x' : 'context', 'context_y' : 'newContext'}, axis=1).fillna(''))
答案 #2: 在为合并准备操作两个数据帧之后,您可以将两个数据帧合并在一起:
dfA
- 使context
列dfA
等于index
,但在更改之前,将其保存为一个系列s
以备后用dfB
- 删除重复项,重置索引,并将索引的名称更改为newContext
以准备合并。合并
event
并用空值context
替换newContext
值。context
更改
context
回其原始数据df['context'] = s
s = dfA['context']
dfA['context'] = dfA.index.astype(str)
dfB = dfB.drop_duplicates().reset_index().rename({'index' :'newContext'}, axis=1).astype(str)
df = pd.merge(dfA, dfB, how='left', on=['event', 'context'])
df['newContext'] = df['newContext'].where(df['newContext'].isnull(), df['context']).fillna('')
df['context'] = s
df
Out[9]:
context event Name newContext
0 0 Special Bob 0
1 2 Special Joan 1
2 4 Bird Susie 2
3 5 Special Alice 3
4 6 Special Tom
5 7 Special Luis
6 8 Parrot Jill 6
7 9 Special Reed 7
8 10 Special Lucas
9 11 Snake Kat 9
10 12 Special Bill 10
11 13 Special Leo
12 14 Special Peter
13 15 Special Mark
14 16 Special Joe
15 17 Special Lora
16 18 Special Care
17 19 Elephant David 17
18 20 Special Ann 18
19 21 Special Larry
20 22 Skunk Tony 20
添加回答
举报