比较具有不同形状的熊猫数据框

时间:2018-06-26 09:01:24

标签: python-3.x pandas dataframe

我有2个数据框,它们实际上来自固定字段文件,我需要找出哪些行是不同的。

>>> df1 = pd.DataFrame([('1', '2018/01',    389.0, 'U'),
               ('2', '2018/02',     24.0,'A'),
               ('3',   '2017/01',   80.5,'U'),
               ('4', '2017/02', np.nan, 'R')],
               columns=['sequence', 'key', 'field1','field2'],
               )

>>> df2 = pd.DataFrame([('1', '2018/01',    389.0, 'U'),
               ('2', '2018/02',     24.0,'A'),
               ('3',   '2018/03',   90.5,'T'),
               ('4', '2017/02', np.nan, 'R'),
               ('5','2017/01',80.5,'U')],
               columns=['sequence', 'key', 'field1','field2'],
               )

“序列”列无关紧要,可以删除,我需要在键列上进行匹配。

df3 = df1!= df2

如果它们的形状相同,则可以工作,但我得到: ValueError:只能比较标记相同的DataFrame对象

我尝试了合并,但这使我有更多的列

我想我想用较大的数据框“键”列重新索引较小的数据框,并用NaN填充它。

然后它们将是相同的形状,我可以将它们进行比较;

>>> new_index = df2.take([1],axis=1)
>>> new_index
       key
0  2018/01
1  2018/02
2  2018/03
3  2017/02
4  2017/01

看起来不错,但

df3 = df1.reindex(new_index,1)

不正确

df3 = df1.reindex(new_index,['key'])
df3
        key
(2018/01,)  NaN
(2018/02,)  NaN
(2018/03,)  NaN
(2017/02,)  NaN
(2017/01,)  NaN

这也不是

2 个答案:

答案 0 :(得分:2)

我认为需要为set_indexreindex在两个key的{​​{1}}列中创建索引,然后为相同的索引创建{{3}}(列名相同,因此可以进行比较) :

DataFrame

答案 1 :(得分:2)

使用datacompy比较两个数据帧。 您可以使用pip install datacompy进行安装以查找唯一的行。

import datacompy
d=datacompy.Compare(df1,df2,join_columns='key')
print(d.df2_unq_rows)
print(d.df1_unq_rows)

您还可以通过使用datacompy获得有关两个数据帧的许多其他统计信息。

查找有关数据复制here的更多信息。