例如,两个名为df1,df2的数据帧显示如下:
### df1
Name Code Mass
5N11 s1 0.1545
5N12 NaN 0.22
5N13 s3 0.2123
5N15 s5 0.1486
5N17 NaN 0.2100
### df2
Name Code Mass
5N12 s2 0.22
5N13 NaN 0.2123
5N14 s4 0.35
5N16 s6 0.07
5N17 s7 0.2100
一些背景介绍:
df1和df2是两个数据帧,都包含某些项目的部分数据。
df1和df2中的某些名称相同。
df1和df2中对应相同名称的质量相等。
有些行包含有限代码,有些则没有。
我想做的是通过名称将这两个数据框合并在一起,并结合其代码和质量。
更新资料
我的尝试似乎奏效!
df = pd.concat([df1,df2],ignore_index= True)
df = df.dropna(subset= ["Code"])
df = pd.merge(df.groupby('Name').sum().reset_index(),
df[['Name', 'Code',"Mass"]].drop_duplicates(),
how='right')
似乎在再现正确的结果。
最佳答案
以df1
开头,并从df2
缺失的地方填写。这要求我们将每个索引设置为“名称”
快速解决方案
df1.set_index('Name').combine_first(df2.set_index('Name'))
完整解决方案
设定
from StringIO import StringIO
import pandas as pd
text1 = """Name Code Mass
5N11 s1 0.1545
5N12 NaN 0.22
5N13 s3 0.2123
5N15 s5 0.1486
5N17 NaN 0.2100"""
text2 = """Name Code Mass
5N12 s2 0.22
5N13 NaN 0.2123
5N14 s4 0.35
5N16 s6 0.07
5N17 s7 0.2100"""
df1 = pd.read_csv(StringIO(text1), delim_whitespace=True)
df2 = pd.read_csv(StringIO(text2), delim_whitespace=True)
合并结果
df1.set_index('Name').combine_first(df2.set_index('Name')).reset_index()
看起来像:
Name Code Mass
0 5N11 s1 0.1545
1 5N12 s2 0.2200
2 5N13 s3 0.2123
3 5N14 s4 0.3500
4 5N15 s5 0.1486
5 5N16 s6 0.0700
6 5N17 s7 0.2100
关于python - 通过相同的行名称融合两个数据框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37382128/