Python如何应用。在数据框中替换大量要更改的值

2024-05-13 23:34:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我怎样才能更有效地执行下面的任务?

我有两个数据帧;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)]

手工操作是一个漫长的过程,我需要找到更有效的方法来完成它。你知道吗


Tags: 数据原始数据googlelocreplacemapsdf1cw
3条回答

使用Series.replace

cw['adgroup']=cw['adgroup'].replace(reff_table.set_index('adgroup')['new_adgroup'])

您可以使用合并/联接

原始数据帧:

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

Pandasdocumentation对这些有一个简短的解释,但是假设您的参考数据帧缺少adgroupAppStore代码(如果您的原始数据帧也缺少某些内容,同样的想法也适用),并且如下所示:

      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

给定以下输入:

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'列,则可以使用pandas.Series.map函数替换原始数据帧'ad_group'列。你知道吗

相关问题 更多 >