Панды объединяют два фрейма данных и сохраняют данные из одного набора данных, если некоторые строки отсутствуют в другом фрейме данных - PullRequest
1 голос
/ 11 октября 2019

У меня есть два кадра данных, df1 и df2

import pandas as pd

df1 = pd.DataFrame([["name_"+str(i) for i in range(10)], list(range(10))]).transpose()
df1.columns = ["Name", "Score"]

df2 = pd.DataFrame([["name_"+str(i) for i in range(2,7)], list(range(12,17))]).transpose()
df2.columns = ["Name", "Score"]

Я хочу объединить кадры данных таким образом, чтобы все строки, которые находятся в df1, присутствовали в результате, но везде, где Name значения в df1 присутствуют в df2, результат должен содержать значения от df2. По сути, я хочу обновить df1 значениями от df2 везде, где Name совпадает

Это то, что я ищу

     Name  Score
0  name_0      0
1  name_1      1
2  name_2     12
3  name_3     13
4  name_4     14
5  name_5     15
6  name_6     16
7  name_7      7
8  name_8      8
9  name_9      9

Есть ли способ, которым я могувыполните эту операцию, используя операцию соединения. Я смог сделать это с помощью операции присваивания

df1.loc[df1['Name'].isin(df2['Name']), "Score"] = df2["Score"].values

Есть ли способ сделать это с помощью операции соединения?

1 Ответ

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

Одной из идей является использование DataFrame.update:

df1 = df1.set_index('Name')
df2 = df2.set_index('Name')

df1.update(df2)
df1 = df1.reset_index()
print (df1)
     Name Score
0  name_0     0
1  name_1     1
2  name_2    12
3  name_3    13
4  name_4    14
5  name_5    15
6  name_6    16
7  name_7     7
8  name_8     8
9  name_9     9

Есть ли способ сделать это с помощью операции соединения?

Да, вы можете объединиться, а затем заменить отсутствующие значения на Series.fillna и DataFrame.pop для столбца извлечения:

df = df1.join(df2.set_index('Name'), on='Name', lsuffix='_')
#merge alternative
#df = df1.merge(df2, on='Name', how='left', suffixes=('_', ''))
df['Score'] = df['Score'].fillna(df.pop('Score_'))
print (df)
     Name  Score
0  name_0      0
1  name_1      1
2  name_2     12
3  name_3     13
4  name_4     14
5  name_5     15
6  name_6     16
7  name_7      7
8  name_8      8
9  name_9      9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...