我怎样才能更有效地执行下面的任务?
我有两个数据框; df1 有我的原始数据,df2 有需要在 df1 中更新的 key 。
问题是大约有 2000 个名称需要更改。
cw=
id adgroup cost
1001 GoogleMaps 101,1
1002 Google 101,1
1003 AppStore 101,1
1004 GoogleDocs 101,1
reff_table=
adgroup new_adgroup
GoogleMaps G_maps
Google GG
AppStore APG
GoogleDocs DOC
我是这样做的:
m1 = cw.loc[cw['adgroup']=='GoogleMaps'].replace({'GoogleMaps' :'G_maps'})
m2 = cw.loc[cw['adgroup']=='GoogleMaps'].replace({'Google' :'GG'})
final_cw = pd.concat([m1, m2)]
手动执行此操作是一个漫长的过程,我需要找到更有效的方法来完成它。
最佳答案
你可以只使用合并/连接
您的原始数据框:
print(df1)
id adgroup cost
0 1001 GoogleMaps 101
1 1002 GoogleMaps 101
2 1003 Google 101
3 1004 AppStore 101
4 1005 AppStore 101
5 1006 GoogleDocs 101
包含引用的数据框:
print(df2)
adgroup new_adgroup
0 GoogleMaps G_Maps
1 Google GG
2 AppStore APG
3 GoogleDocs DOC
在 adgroup
上合并它们会将引用值与原始数据中的正确行对齐(然后您可以根据需要删除/重命名/重新排序列):
df1.merge(df2, on='adgroup').drop(columns=['adgroup']).rename(columns={'new_adgroup':'adgroup'})
id cost adgroup
0 1001 101 G_Maps
1 1002 101 G_Maps
2 1003 101 GG
3 1004 101 APG
4 1005 101 APG
5 1006 101 DOC
加入方法
假设您的原始数据框和引用数据框不是完美匹配 - 您如何处理额外/缺失的行?
有多种连接方法可供您使用:left
、right
、outer
、inner
Pandas documentation对这些有一个简短的解释,但是假设您的引用数据框缺少 AppStore
的 adgroup
代码(如果您的原始数据框也缺少某些东西,同样的想法也适用)并且看起来像这样:
adgroup new_adgroup
0 GoogleMaps G_Maps
1 Google GG
2 GoogleDocs DOC
原始数据中的 AppStore
行发生了什么变化?好吧,你可以控制...
如果您想确定原始数据的优先级并确保保留这些行,您可以使用 left
联接,并且您将简单地为缺失的数据提供 NA
值代码:
df1.merge(df2, on='adgroup', how='left')
id cost adgroup
0 1001 101 G_Maps
1 1002 101 G_Maps
2 1003 101 GG
3 1004 101 NaN
4 1005 101 NaN
5 1006 101 DOC
相反,如果您想确定引用数据框的优先级,以便只有在引用中找到的代码才会出现在您的输出中,您可以使用 right
连接。请注意,由于 AppStore
不在您的引用数据框中,因此原始数据中的 AppStore
行已被删除:
df1.merge(df2, on='adgroup', how='right')
id cost adgroup
0 1001 101 G_Maps
1 1002 101 G_Maps
2 1003 101 GG
3 1006 101 DOC
关于Python如何在数据框中应用.replace以更改大量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58566550/