这是我上一个问题的扩展: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]
有人可以在这里帮忙吗?
答案 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()系列将是理想的结果