【问题标题】:comparing pandas dataframe with different shapes比较具有不同形状的熊猫数据框
【发布时间】:2018-06-26 09:01:24
【问题描述】:

我有 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'],
               )

'sequence' 列不相关,可以删除,我需要在 key 列上匹配它们。

df3 = df1 != df2

如果它们是相同的形状会起作用,但我得到: ValueError:只能比较标记相同的 DataFrame 对象

我已经尝试过合并,但它给了我更多的列

我想我想用较大的 dataframes 'key' 列重新索引较小的 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

这也不是

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    您可以在DataFrames 和set_index 中通过key 列创建索引,然后为相同的索引创建reindex(列名相同,因此可以进行比较):

    df2 = df2.set_index('key')
    df1 = df1.set_index('key').reindex(df2.index)
    print (df1)
            sequence  field1 field2
    key                            
    2018/01        1   389.0      U
    2018/02        2    24.0      A
    2018/03      NaN     NaN    NaN
    2017/02        4     NaN      R
    2017/01        3    80.5      U
    
    df3 = df1 != df2 
    print (df3)
             sequence  field1  field2
    key                              
    2018/01     False   False   False
    2018/02     False   False   False
    2018/03      True    True    True
    2017/02     False    True   False
    2017/01      True   False   False
    

    【讨论】:

    • @Mehdi LAMRANI - 谢谢。
    • 不客气。现在在项目中使用这个巧妙的技巧。
    【解决方案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 获得有关两个数据帧的许多其他统计信息。

    详细了解 datacompy here

    【讨论】:

      猜你喜欢
      • 2017-03-28
      • 2021-10-08
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      相关资源
      最近更新 更多