通过相同的行名

时间:2016-05-23 03:15:57

标签: python pandas

例如,名为 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')

似乎正在重现正确的结果。

enter image description here

1 个答案:

答案 0 :(得分:1)

df1开始,并填写df2,其中df1缺失。 要求我们将每个的索引设置为'名称'

快速解决方案

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