заменить строку под несколькими, если условия в Pandas - PullRequest
0 голосов
/ 26 сентября 2018

Если у меня есть кадр данных следующим образом:

import pandas as pd
df = pd.DataFrame({
        'items': ['countryName', 'stateName', 'currencyName', 'companyName'],
        'code': ['NK', 'NK', 'NK', 'NK']
     })
print(df)

          items code
0   countryName   NK
1     stateName   NK
2  currencyName   NK
3   companyName   NK

Как можно преобразовать NK при нескольких условиях, например, если его элементы имеют значение «countryName», измените NK на Северную Корею, если его элементы имеют значение «stateName ", измените NK на" North Kingstown "и так далее.Обратите внимание, что это только часть данных.Спасибо.

df = pd.DataFrame({
        'items': ['countryName', 'stateName', 'currencyName', 'companyName'],
        'code': ['North Korea', 'North Kingstown', 'Norwegian krone', 'Northrup-King']
     })
print(df)
          items             code
0   countryName      North Korea
1     stateName  North Kingstown
2  currencyName  Norwegian krone
3   companyName    Northrup-King

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Вы можете сохранить ключ и значения в 2 разных файлах, вероятно, в листе Excel, и прочитать их непосредственно там, используя pd.read_excel(file)

Если мы назовем их df и df1:

df:

     code            items
0    NK              countryName 
1    NK              stateName 
2    NK              currencyName 
3    NK              companyName 

df1:

     code               items
0    North Korea      countryName 
1    North Kingstown  stateName 
2    Norwegian krone  currencyName 
3    Northrup-King    companyName 

Тогда:

df = df.merge(df1,on='items').drop('code_x',axis=1)
df.columns=['items','code']

Это сэкономило бы много строк кода, я думаю..

0 голосов
/ 26 сентября 2018

Я бы сделал это:

df = pd.DataFrame({
        'items': ['countryName', 'stateName', 'currencyName', 'companyName'],
        'code': ['NK', 'NK', 'NK', 'NK']
     })

country_value = {'NK': "North Korea"}
state_value = {'NK': 'North Kingstown'}
currency_value = {'NK' : 'Norwegian Krone'}
company_value = {'NK': 'Northrup-king'}

def pair(x):
    if x['items'] == 'countryName':
        x['code'] = country_value[x['code']]
    elif x['items'] == 'stateName':
        x['code'] = state_value[x['code']]
    elif x['items'] == 'currencyName':
        x['code'] = currency_value[x['code']]
    elif x['items'] == 'companyName':
        x['code'] = company_value[x['code']]

    return x


df.apply(pair, axis = 1)

Таким образом, вы можете добавить множество пар ключ-значение страны, штата и т. Д.

0 голосов
/ 26 сентября 2018

Вы можете использовать np.where на DF.Это немного грязно, и я уверен, что кто-то другой может дать вам более чистое решение, но оно работает.

df['code'] = np.where((df['code'] == 'NK') & (df['items'] == 'countryName'),
                      'North Korea',
                       df['code'])

df['code'] = np.where((df['code'] == 'NK') & (df['items'] == 'stateName'),
                      'North Kingstown',
                       df['code'])
... add the rest of the examples

Как это работает:

  • np.where ((условиеодин) & (условие два) & (больше условий) ...
  • значение для столбца «код», если выполняются условия, например, Северная Корея
  • сохранить старое значение (NK), еслиусловия не выполняются

РЕДАКТИРОВАТЬ : добавление простой динамической версии

replace_dict = {'North Korea':['NK','countryName'],'North Kingstown':['NK','stateName']}

for key in replace_dict.keys():
    df['code'] = np.where((df.code == replace_dict[key][0]) & (df['items'] == replace_dict[key][1]),
                          key,
                          df['code'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...