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

加入方法

假设您的原始数据帧和参考数据帧不是完美匹配 - 您如何处理额外/缺失的行?

您可以使用多种连接方法:leftrightouterinner

Pandas documentation 对此进行了简要说明,但假设您的参考数据框缺少 AppStoreadgroup 代码(如果您的原始数据框也缺少某些内容,则同样的想法适用),看起来像这样:

      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。您的选项是leftrightouterinner。您选择哪一个取决于您要优先考虑哪个数据框并保留不匹配的值。例如,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以更改大量值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用熊猫更改数据框中的特定行值? [复制]

在 pandas 数据框中使用 replace 和 str.startswith() 重命名值

python 如何替换 text 文本框中被选中的字符

Python - 替换熊猫数据框中的负无穷大值[重复]

计算火花数据框中的字数

Pyspark 数据框中的 regexp_replace