繁体   English   中英

断言 pandas 数据帧子集的相等性

[英]Assert equality of subsets of pandas dataframes

我有一个pandas数据框列表。 我想确保现有行和列的成对相等。 数据框示例:

import pandas as pd

df1 = pd.DataFrame({"ix": [1, 2, 3], "1": [3, 4, 5]                }).set_index("ix")
df2 = pd.DataFrame({"ix": [1, 2   ], "1": [3, 4   ], "2": [3, 4   ]}).set_index("ix")
df3 = pd.DataFrame({"ix": [   2, 3], "1": [   4, 5], "2": [   4, 6]}).set_index("ix")
df4 = pd.DataFrame({"ix": [      3],                 "2": [      6]}).set_index("ix")
dataframes = [df1, df2, df3, df4]

我的要求满足了。 我编写了以下代码来检查:

from pandas._testing import assert_frame_equal

kwargs = {"check_dtype": False, "check_like": True}

for i, left in enumerate(dataframes):
    for right in dataframes[i + 1:]:
        cl = left.columns.intersection(right.columns)
        ix = left.index.intersection(right.index)
        assert_frame_equal(left.loc[ix, cl], right.loc[ix, cl], **kwargs)

我有一种感觉,对于长列表和巨大的数据框,性能可能非常糟糕。

我的问题:这真的是最好的方法吗?

除了使用itertools.combinations (语法糖?),我不知道如何增强代码:

from itertools import combinations

for left, right in combinations(dataframes, 2):
    cl = left.columns.intersection(right.columns)
    ix = left.index.intersection(right.index)
    assert_frame_equal(left.loc[ix, cl], right.loc[ix, cl], check_like=True)

让我真正感到难过的是嵌套的 for 循环。 我现在有一个只有一个 for 循环的解决方案。

kwargs = {"check_dtype": False, "check_like": True}

basis = pd.concat(dfs).groupby("ix").first()
[assert_frame_equal(basis.loc[df.index, df.columns], df, **kwargs) for df in dfs]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM