Pandas DF根据匹配的单元格名称合并
Pandas DF merge based on matching cell name
我有一个数据框 DF1,其中包含:
Asset Name
Type
Score
Grade
Apple
fruit
nan
nan
Pear
fruit
nan
nan
Banana
fruit
nan
nan
我有 DF2,其中包含:
Asset Name
Score
Grade
Orange
40
C
Banana
100
A
Pear
60
B
Potato
10
F
Apple
70
E
import pandas as pd
data1 = {'Asset Name':['Apple', 'Pear', 'Banana'], \
'Type':['fruit', 'fruit', 'fruit'],'Score':['nan', 'nan','nan'], \
'Grade':['nan','nan','nan']}
data2 = {'Asset Name':['Orange', 'Banana','Pear','Potato','Apple'], \
'Score':[40,100,60,10,70], 'Grade':['C','A','B','F','E']}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
我可以使用:
combined = pd.concat([DF1, Df2]).groupby('Asset Name').first()
这给了我以下信息:
Asset Name
Score
Grade
Type
Apple
70
E
fruit
Banana
100
A
fruit
Orange
40
C
None
Pear
60
B
fruit
Potato
10
F
None
这不是我想要的。我只想添加 Apple、Pear 和 Banana 的分数和等级,因为它们在 DF1 中。如果资产名称不在 DF1 和 Df2 中,则不应更新分数和等级。
同样,如果我尝试使用:
combined = df2.combine_first(df1)
Asset Name
Grade
Score
Type
Orange
C
70
fruit
Banana
A
100
fruit
Pear
B
40
fruit
Potato
F
10
fruit
Apple
E
70
None
我得到了我也不想要的元素,因为我只想更新 DF1 中的元素。
如何只更新 DF1 中与 DF2 中的 'Asset Name' 匹配的行,并将 DF2 中的数据添加到 DF1 中的那些资产?
我想实现的是:
Asset Name
Score
Grade
Type
Apple
70
C
fruit
Pear
60
B
fruit
Banana
100
A
fruit
谢谢
IIUC 使用:
df = df2.set_index('Asset Name').combine_first(df1.set_index('Asset Name')).dropna().reset_index()
print (df)
Asset Name Grade Score Type
0 Apple E 70 fruit
1 Banana A 100 fruit
2 Pear B 60 fruit
我有一个数据框 DF1,其中包含:
Asset Name | Type | Score | Grade |
---|---|---|---|
Apple | fruit | nan | nan |
Pear | fruit | nan | nan |
Banana | fruit | nan | nan |
我有 DF2,其中包含:
Asset Name | Score | Grade |
---|---|---|
Orange | 40 | C |
Banana | 100 | A |
Pear | 60 | B |
Potato | 10 | F |
Apple | 70 | E |
import pandas as pd
data1 = {'Asset Name':['Apple', 'Pear', 'Banana'], \
'Type':['fruit', 'fruit', 'fruit'],'Score':['nan', 'nan','nan'], \
'Grade':['nan','nan','nan']}
data2 = {'Asset Name':['Orange', 'Banana','Pear','Potato','Apple'], \
'Score':[40,100,60,10,70], 'Grade':['C','A','B','F','E']}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
我可以使用:
combined = pd.concat([DF1, Df2]).groupby('Asset Name').first()
这给了我以下信息:
Asset Name | Score | Grade | Type |
---|---|---|---|
Apple | 70 | E | fruit |
Banana | 100 | A | fruit |
Orange | 40 | C | None |
Pear | 60 | B | fruit |
Potato | 10 | F | None |
这不是我想要的。我只想添加 Apple、Pear 和 Banana 的分数和等级,因为它们在 DF1 中。如果资产名称不在 DF1 和 Df2 中,则不应更新分数和等级。
同样,如果我尝试使用:
combined = df2.combine_first(df1)
Asset Name | Grade | Score | Type |
---|---|---|---|
Orange | C | 70 | fruit |
Banana | A | 100 | fruit |
Pear | B | 40 | fruit |
Potato | F | 10 | fruit |
Apple | E | 70 | None |
我得到了我也不想要的元素,因为我只想更新 DF1 中的元素。
如何只更新 DF1 中与 DF2 中的 'Asset Name' 匹配的行,并将 DF2 中的数据添加到 DF1 中的那些资产?
我想实现的是:
Asset Name | Score | Grade | Type |
---|---|---|---|
Apple | 70 | C | fruit |
Pear | 60 | B | fruit |
Banana | 100 | A | fruit |
谢谢
IIUC 使用:
df = df2.set_index('Asset Name').combine_first(df1.set_index('Asset Name')).dropna().reset_index()
print (df)
Asset Name Grade Score Type
0 Apple E 70 fruit
1 Banana A 100 fruit
2 Pear B 60 fruit