Python如何在数据框中应用.replace以更改大量值
Posted
技术标签:
【中文标题】Python如何在数据框中应用.replace以更改大量值【英文标题】:Python how to apply .replace in data frame for a large amount of values to be changed 【发布时间】:2020-02-22 06:43:33 【问题描述】:我怎样才能更有效地执行下面的任务?
我有两个数据框; df1 有我的原始数据,df2 有需要在 df1 中更新的键。
问题是大约有 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)]
手动操作是一个漫长的过程,我需要找到更有效的方法来完成它。
【问题讨论】:
您应该只加入adgroup
上的2 个数据框,然后new_adgroup
成为您的新adgroup
列,并具有正确的重命名值
【参考方案1】:
你可以只使用合并/加入
您的原始数据框:
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
【讨论】:
@thanks Simon,比如说有几行不匹配,可以在代码中写一些东西来忽略并加入任何匹配项吗? 是的,所以只要你加入how
。您的选项是left
、right
、outer
、inner
。您选择哪一个取决于您要优先考虑哪个数据框并保留不匹配的值。例如,df1.merge(df2, on='adgroup', how='left')
会优先考虑您的原始数据,因此如果它的名称不在参考表中,它仍会在新数据框中(它只包含缺失参考的 NA 值)
pandas 文档对此进行了解释 (pandas.pydata.org/pandas-docs/stable/reference/api/…),或者只是大致了解一下数据库连接的工作原理
@Peter 为了完整起见,我添加了对连接方法的简要说明,以解决您对不匹配/缺失行的担忧(请参阅我的编辑)【参考方案2】:
给定以下输入:
df_data = pd.DataFrame([['GoogleMaps', 100, 1], ['Google', 200, 2], ['PlayStore', 300, 3]], columns=['ad_group', 'cost', 'id'])
df_new_index = pd.DataFrame([['GoogleMaps', 'GMaps'], ['Google', 'GG'], ['PlayStore', 'PS']], columns=['ad_group', 'new_ad_group'])
试试这个单行代码:
df_data.ad_group = df_data.ad_group.map(df_new_index.set_index('ad_group')['new_ad_group'])
并给出:
ad_group cost id
0 GMaps 100 1
1 GG 200 2
2 PS 300 3
如果您将索引设置为另一个数据框上的 'ad_group'
列,那么您可以在原始数据框 'ad_group'
列上使用 pandas.Series.map 函数替换。
【讨论】:
【参考方案3】:使用Series.replace
cw['adgroup']=cw['adgroup'].replace(reff_table.set_index('adgroup')['new_adgroup'])
【讨论】:
,谢谢,例如,可以说 df(table_reff) 中的几行与 df(cw) 不匹配,可以在代码中编写一些内容以忽略并加入任何匹配项吗?保留原始 df 值以上是关于Python如何在数据框中应用.replace以更改大量值的主要内容,如果未能解决你的问题,请参考以下文章