【发布时间】:2022-01-17 15:49:06
【问题描述】:
我有一个数据框 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 中“资产名称”的行,并将 DF2 中的数据添加到 DF1 中的这些资产中?
我想要达到的目标如下:
| Asset Name | Score | Grade | Type |
|---|---|---|---|
| Apple | 70 | C | fruit |
| Pear | 60 | B | fruit |
| Banana | 100 | A | fruit |
谢谢
【问题讨论】:
-
如果
score和Grade列在df1中都是空的,那么你只需要:df1 = df1[['Asset Name', 'Type']].merge(df2, how='left', on=['Asset Name'])
标签: python pandas dataframe merge concatenation