【问题标题】:compare two pandas data frame比较两个熊猫数据框
【发布时间】:2016-10-25 15:07:33
【问题描述】:

我有两个这样定义的熊猫数据框:

_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 的任何添加。示例返回 [4, "John", 1.2] 和 [5, "Lisa", 2.2]

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

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

ValueError: Can only compare identically-labeled DataFrame objects

熊猫版本:'0.16.1'

建议?

【问题讨论】:

标签: python pandas numpy


【解决方案1】:

设置

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

添加

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

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

删除

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

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


0.16.1回答

设置

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

添加

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

删除

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

【讨论】:

  • indicator=True 似乎不是一个有效的参数,这是新的吗?我正在使用版本“0.16.1”
  • @josh1234 是的!从 0.16.1 开始绝对是新的。是升级选项。我会给你一些对你有用的东西。这是一个简单的调整。
  • 很遗憾我无法升级 :( 如果您知道其他方法,请告诉我!
  • 这太棒了!谢谢你。有没有办法查看一行,如果一行有 NaN 则将其标记为新行?还是旧的?
  • 很棒的例子!非常感谢。这应该是一个冻结的讨论,因为它太好了!
【解决方案2】:

这样做:

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 表示不相交的值

【讨论】:

  • 所以这可以用于查找 GPA 差异,但我还有其他列,如文本,我也需要找到差异。比如地址数据等。我只是在论坛里放了一个我的数据集的简化例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多