Python как применить .replace во фрейме данных для большого количества значений, которые будут изменены - PullRequest
1 голос
/ 26 октября 2019

Как мне выполнить задачу ниже более эффективным способом?

У меня есть два фрейма данных;У 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)]

Делать это вручную - долгий процесс, мне нужно найти более эффективный способ сделать это.

Ответы [ 3 ]

2 голосов
/ 26 октября 2019

Вы можете просто использовать объединение / объединение

Ваш оригинальный фрейм данных:

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 содержит краткое объяснение этого, но допустим, что в вашем справочном кадре данных отсутствовал код adgroup для AppStore (та же идея применима, если ваш исходный кадр данныхтакже чего-то не хватает) и выглядит так:

      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
1 голос
/ 26 октября 2019

С учетом следующего ввода:

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'.

1 голос
/ 26 октября 2019

Использование Series.replace

cw['adgroup']=cw['adgroup'].replace(reff_table.set_index('adgroup')['new_adgroup'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...