#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')