【问题标题】:Pandas DF merge based on matching cell namePandas DF 合并基于匹配的单元格名称
【发布时间】: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

谢谢

【问题讨论】:

  • 如果scoreGrade 列在df1 中都是空的,那么你只需要:df1 = df1[['Asset Name', 'Type']].merge(df2, how='left', on=['Asset Name'])

标签: python pandas dataframe merge concatenation


【解决方案1】:

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

【讨论】:

  • 这并不能完全满足我的需求。如您所见,Apple、Pear 和 Banana 并未按应有的方式更新。
  • @blupacetek - 你能检查编辑的答案吗?
  • 这就是我要找的,谢谢 Jezrael ! :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 2015-08-10
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多