[英]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.