比较两个pandas数据框

时间:2016-10-25 15:07:34

标签: python pandas numpy

我有两个像这样定义的pandas数据帧:

_data_orig = [
    [1, "Bob", 3.0],
    [2, "Sam", 2.0],
    [3, "Jane", 4.0]
]
_columns = ["ID", "Name", "GPA"]

_data_new = [
        [1, "Bob", 3.2],
        [3, "Jane", 3.9],
        [4, "John", 1.2],
        [5, "Lisa", 2.2]
    ]
_columns = ["ID", "Name", "GPA"]

df1 = pd.DataFrame(data=_data_orig, columns=_columns)
df2 = pd.DataFrame(data=_data_new, columns=_columns)

我需要找到以下信息:

  • 查找删除,其中df1是原始数据集,df2是新数据集
  • 我需要找到两者之间现有记录的行更改。示例ID == 1应比较df2的ID == 1,以查看是否为每行更改了任何列值。
  • 查找df2经文df1的任何添加内容。示例return [4,“John”,1.2]和[5,“Lisa”,2.2]

对于查找行变化的操作,我想我可以查看df2并检查df1,但这似乎很慢,所以我希望在那里找到更快的解决方案。

对于其他两个操作,我真的不知道该怎么做,因为当我尝试比较我得到的两个数据帧时:

ValueError: Can only compare identically-labeled DataFrame objects

熊猫版:'0.16.1'

建议?

2 个答案:

答案 0 :(得分:5)

设置

m = df1.merge(df2, on=['ID', 'Name'], how='outer', suffixes=['', '_'], indicator=True)
m

enter image description here

添加

m.loc[m._merge.eq('right_only')]

m.query('_merge == "right_only"')

enter image description here

删除

m.loc[m._merge.eq('left_only')]

m.query('_merge == "left_only"')

enter image description here

0.16.1回答

设置

m = df1.merge(df2, on=['ID', 'Name'], how='outer', suffixes=['', '_'])
m

enter image description here

添加

m.loc[m.GPA_.notnull() & m.GPA.isnull()]

enter image description here

删除

m.loc[m.GPA_.isnull() & m.GPA.notnull()]

enter image description here

答案 1 :(得分:0)

这样做:

df1.set_index(['Name','ID'])-df2.set_index(['Name','ID'])
Out[108]: 
            GPA
Name ID        
Bob  1  -0.2000
Jane 3   0.1000
John 4      nan
Lisa 5      nan
Sam  2      nan
如果df1和df2之间存在差异,

将允许您进行筛选。 NaN表示不相交的值