【问题标题】:python: compare equality of N dataframespython:比较N个数据帧的相等性
【发布时间】:2021-08-19 11:35:47
【问题描述】:

我有一个 dfs 列表,其中一些共享一个共同的列“b”值。我将这些 dfs 按它们的“b”值分组,然后想比较其余列的任何差异。我需要直观地输出不同的列(而不是仅仅识别哪些列/行不同,我知道你可以用 pandas.testing assert_frame_equal 来做)。到目前为止,我通过根据存储在列表中的 dfs 的数量预先指定要运行的比较次数来做到这一点(如下面的第三部分所示)。但是我想这样做而不必指定要比较的 dfs 的数量,以防有更多时间。

比较的替代方法可以是 .isin(带有 ~ 所以它不在?)或我正在查看 rn 的反合并。

非常欢迎所有 cmets。非常感谢!

数据

import pandas as pd

df1 = pd.DataFrame(data={'id': [1, 2, 3], 'a': [1,2,3], 'b': ['t1','t1','t1']})
df2 = pd.DataFrame(data={'id': [1, 2, 4], 'a': [2,2,4], 'b': ['t1','t1','t1']})
df3 = pd.DataFrame(data={'id': [1, 2, 3], 'a': [1,2,3], 'b': ['t2','t2','t2']})
df4 = pd.DataFrame(data={'id': [1, 2, 3], 'a': [1,2,3], 'b': ['t3','t3','t3']})
df5 = pd.DataFrame(data={'id': [1, 2, 3], 'a': [1,2,3], 'b': ['t1','t1','t1']})

df_lst=[df1,df2,df3,df4,df5]

根据'b'列中的组拆分到列表

from itertools import groupby

out = []
for _, g in groupby(
    sorted(df_lst, key=lambda k: k["b"].tolist()), lambda k: k["b"].tolist()):
    out.append(list(g))

比较存储在 'out' 中的 dfs 列表中的每个 df

for i in out:
    if len(i) > 1:
        a = (i[0].compare(i[1]))
        b = (i[0].compare(i[2]))
        c = (i[1].compare(i[2]))
lst=(a,b,c)
pd.concat(lst)

可能是这样的,但这只会将 0 与所有其他 dfs 进行比较,因此不起作用

for i in out:
    if len(i)>1:
        for j in range(len(i)):
            a = i[0].compare(i[j])
            o.append(a)

【问题讨论】:

    标签: python pandas list dataframe compare


    【解决方案1】:

    以下内容应将out 的每个条目与其他所有条目进行比较:

    if all(isinstance(x, list) for x in out):
        out_df = []
        for entry in out:
            out_df.append(pd.DataFrame(entry))
        out = out_df
    
    comp_list = []
    for i, entry_1 in enumerate(out):
        for j, entry_2 in enumerate(out):
            if j > i:
                comp = (entry_1.compare(entry_2))
                comp_list.append(comp)
    
    lst = tuple(comp_list)
    pd.concat(lst)
    

    编辑:我在 sn-p 的开头添加了 if 语句,以说明 out 存储列表而不是数据帧的情况(就像您原始示例中的情况一样分裂后)。

    【讨论】:

    • 嗨@georgykoshteyn。感谢您的输入。但是这会引发 AttributeError: 'list' object has no attribute 'compare' 错误,我不知道为什么
    • @br101 发生错误,因为out 不是数据帧列表,而是列表列表。也就是说,当您拆分数据时,您在将g 附加到out 之前将list() 应用于g。但是,compare() 是一种数据帧方法——列表没有这种方法。为了解决这个问题,您可以将out 的条目转换为数据帧(分别在拆分过程中分别不应用list())。我已经更新了我的答案以解决这种情况。让我知道它是否适合你。
    猜你喜欢
    • 1970-01-01
    • 2022-08-05
    • 2016-01-06
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多