Обновить несколько столбцов из другого кадра данных на основе одного общего столбца в Pandas - PullRequest
3 голосов
/ 26 апреля 2020

Учитывая следующие два кадра данных:

df1:

   id city district  year  price
0   1  bjs      cyq  2018     12
1   2  bjs      cyq  2019      6
2   3   sh       hp  2018      4
3   4  shs      hpq  2019      3

df2:

   id city district  year
0   1   bj       cy  2018
1   2   bj       cy  2019
2   4   sh       hp  2019

скажем, некоторые значения в city и district из df1 есть ошибки, поэтому мне нужно обновить city и district значения 'в df1 значениями df2 на основе id, мой ожидаемый результат будет следующим:

   id city district  year  price
0   1   bj       cy  2018     12
1   2   bj       cy  2019      6
2   3   sh       hp  2018      4
3   4   sh       hp  2019      3

Как я мог сделать это в Pandas? Спасибо.

Обновление:

Решение 1:

cities = df2.set_index('id')['city']
district = df2.set_index('id')['district']

df1['city'] = df1['id'].map(cities)
df1['district'] = df1['id'].map(district)

Решение 2:

df1[["city","district"]] = pd.merge(df1,df2,on=["id"],how="left")[["city_y","district_y"]]

print(df1)

Выход:

   id city district  year  price
0   1   bj       cy  2018     12
1   2   bj       cy  2019      6
2   3  NaN      NaN  2018      4
3   4   sh       hp  2019      3

Обратите внимание, что city и district для id равно 3 NaN с, но я хочу сохранить значения от df1.

Ответы [ 3 ]

3 голосов
/ 26 апреля 2020

Попробуйте combine_first:

df2.set_index('id').combine_first(df1.set_index('id')).reset_index()

Вывод:

   id city district  price    year
0   1   bj       cy   12.0  2018.0
1   2   bj       cy    6.0  2019.0
2   3   sh       hp    4.0  2018.0
3   4   sh       hp    3.0  2019.0
1 голос
/ 26 апреля 2020

IIU C, мы можем использовать .map

edit - ввод изменен.

target_cols = ['city','district']

df1.loc[df1['id'].isin(df2['id']),target_cols] = np.nan

cities = df2.set_index('id')['city']
district = df2.set_index('id')['district']

df1['city'] = df1['city'].fillna(df1['id'].map(cities))
df1['district'] = df1['district'].fillna(df1['id'].map(cities))


print(df1)

   id city district  year  price
0   1   bj       bj  2018     12
1   2   bj       bj  2019      6
2   3   sh       hp  2018      4
3   4   sh       sh  2019      3
1 голос
/ 26 апреля 2020

Попробуйте это

df1[["city","district"]] = pd.merge(df1,df2,on=["id"],how="left")[["city_y","district_y"]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...