【发布时间】: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