扩展数据框比较列并返回差值

时间:2019-04-01 13:52:05

标签: pandas python-2.7 dataframe

这是我上一个问题的扩展:Comparing columns of dataframes and returning the difference

在比较了我的37个数据框集合中所有数据框的列之后,我发现某些数据框具有相似的列,而另一些具有不同的列。因此,现在需要比较这些不同的数据帧并返回差值。该步骤应该继续,直到所有数据帧都被分为两组,即,具有相似列的数据帧被分为一组,而具有不同列的数据帧被分为第二组。

例如:


df = [None] * 6

df[0] = pd.DataFrame({'a':[1,2,3],'b':[3,4,5], 'c':[7,8,3], 'd':[1,5,3]})
df[1] = pd.DataFrame({'a':[1,2,3],'b':[3,4,5], 'c':[7,8,3], 'd':[1,5,3]})
df[2] = pd.DataFrame({'a':[1,2,3],'b':[3,4,5], 'x':[7,8,3], 'y':[1,5,3]})
df[3] = pd.DataFrame({'a':[1,2,3],'b':[3,4,5], 'c':[7,8,3], 'd':[1,5,3]})
df[4] = pd.DataFrame({'a':[1,2,3],'b':[3,4,5], 'x':[7,8,3], 'z':[1,5,3]})
df[5] = pd.DataFrame({'a':[1,2,3],'b':[3,4,5], 'x':[7,8,3], 'y':[1,5,3]})

# code to group the dataframes into similar and different cols groups

nsame = []
same = []
    for i in range(0, len(df)):
        for j in range(i+1, len(df)):
            if not (df[i].columns.equals(df[j].columns)):
                nsame.append(j)
            else:
                same.append(i)

当我将上述代码打印到同一组(相同)时,输出为:

print(same)
[0, 0, 1, 2]

所需的输出:

print(same)
[0, 1, 3]

也许我需要一个递归函数来将所有相似的列分组为一组,并将所有不同的列数据帧分组为不同的组。但是,棘手的部分是可以有两个以上的组。例如,在上面的代码中,有3个组:

Group1: df[0], df[1], df[3]
Group2: df[2], df[5]
Group3: df[4]

有人可以在这里帮忙吗?

2 个答案:

答案 0 :(得分:1)

这是一种方法

s=pd.Series([','.join(x) for x in df])
s.groupby(s).groups # the out put here already make the dfs into groups 
Out[695]: 
{'a,b,c,d': Int64Index([0, 1, 3], dtype='int64'),
 'a,b,x,y': Int64Index([2, 5], dtype='int64'),
 'a,b,x,z': Int64Index([4], dtype='int64')}

[y.index.tolist() for x , y in s.groupby(s)]
Out[699]: [[0, 1, 3], [2, 5], [4]]

答案 1 :(得分:0)

将所有列名称作为不同的pandas数据框传递起来不是很容易,即:

a - b - c - d
a - b - c - d
a - b - x - y
...

然后只需对列进行简单的分组即可

groupby res上的count()系列将是理想的结果