Pandas: сравнить два фрейма данных и заменить определенным значением, если его нет в столбце?

#pandas

#pandas

Вопрос:

 df1 = pd.DataFrame({'name': ['AUD','CAD', 'SMI','Joy', 'SHA', 'CHY', 'AUD', 'KRL'], 
       'sal': [200,300,600,500,300,200,100,350]})
df2 = pd.DataFrame({'name': ['SMI','Joy', 'SHA', 'CHY'], 
       'sal': [600,500,300,200]})
  

Я хочу сравнить вышеуказанные два фрейма данных по столбцу ‘name’, и если значения df2 ‘name’ недоступны, то df1 ‘name’ замените на ‘Others’. Мой ожидаемый результат, как показано ниже

 new_df = pd.DataFrame({'name': ['Others','Others' ,'SMI','Joy', 'SHA', 'CHY','Others','Others'], 
       'sal': [200,300,600,500,300,200,100,350]})
  

Ответ №1:

Давайте попробуем where и isin :

 df1['name'] = df1['name'].where(df1['name'].isin(df2['name']), 'Others')
  

Вывод ( df1 ):

      name  sal
0  Others  200
1  Others  300
2     SMI  600
3     Joy  500
4     SHA  300
5     CHY  200
6  Others  100
7  Others  350
  

Ответ №2:

Однострочный, использующий только np.where :

 In [1164]: df1.name = np.where(df1['name'].isin(df2['name']), df1.name, 'Others')
  

или:

Вы можете использовать df.merge с numpy.where :

 In [1152]: import numpy as np

In [1153]: res = df2.merge(df1, on='name', how='right')
In [1155]: res.name = np.where(res.sal_x.isna(), 'Others', res.name)

In [1159]: res = res.drop('sal_x', 1).rename(columns={'sal_y':'sal'})

In [1160]: res
Out[1160]: 
     name  sal
0  Others  200
1  Others  100
2  Others  300
3     SMI  600
4     Joy  500
5     SHA  300
6     CHY  200
7  Others  350
  

Ответ №3:

Вы должны использовать метод pandas where . По сути, это выполняет замену на основе логического сопоставления, выполняемого на итераторе:

 df1['new_name'] = df1['name'].where(
    df1['name'].isin(df2['name'],
    df1['name'],
    'Others')
  

Чтобы разобраться с этим, вы можете создать логический столбец и сопоставить его самостоятельно:

 map = df1['name'].isin(df2['name'])
df1['name'].where(map, 'Others')