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
添加回答
舉報