比较数据框的列并返回差值

时间:2019-04-01 09:59:55

标签: pandas python-2.7 dataframe

我有多个数据框(大约37个),并且想比较这些数据框的列名称,以便我知道它们所有的列和列顺序都相同。数据帧存储为对象列表(例如,tbl [0]是第一个数据帧,tbl [1]是第二个数据帧,依此类推)。

我编写了以下代码块,它将获取我的数据框(tbl)的每一列,并将它们与其他数据框的列进行比较,如果存在差异,则将这些数据框的索引附加到2D列表中,我可以稍后回想一下,以查看列不匹配的地方。

a = [[]]
for i in range(0,len(tbl)):
    for j in range(i+1, len(tbl)):
        if(~(tbl[i].columns.equals(tbl[j].columns))):
            a.append([i, j])

但是,当我运行上面的代码时,它将附加我正在比较的所有数据帧索引。我在这里做错什么吗?

示例:

tbl = []

for i in range(0,3):
    tbl.append(pd.DataFrame({'a':[1,2,3],'b':[3,4,5], 'c':[7,8,3], 'd':[1,5,3]}))

a = [[]]
for i in range(0,len(tbl)):
    for j in range(i+1, len(tbl)):
        if(~(tbl[i].columns.equals(tbl[j].columns))):
            a.append([i, j])

出于这个问题,我创建了3个虚拟数据框,它们具有相同的列名(a,b,c,d)。当使用前面提到的代码比较列名时,得到以下输出:

[[], [0, 1], [0, 2], [1, 2]]

我应该得到一个空名单吗?我在这里做什么错了?

1 个答案:

答案 0 :(得分:1)

使用if notbool scalars一起使用:

print (~True)
-2

a = [[]]
for i in range(0,len(tbl)):
    for j in range(i+1, len(tbl)):
        if not (tbl[i].columns.equals(tbl[j].columns)):
            a.append([i, j])

print (a)
[[]]