如何检查数据框的所有列都相同?

时间:2020-10-19 17:59:55

标签: python pandas dataframe

检查熊猫数据框中所有列是否相同的快速方法是什么?

例如我有一个下面带有a,b,c列的数据框,我需要检查这些列是否都相同,即a = b = c

+---+---+---+
| a | b | c |
+---+---+---+
| 5 | 5 | 5 |
| 7 | 7 | 7 |
| 9 | 9 | 9 |
+---+---+---+

我曾经考虑过使用apply来遍历所有行,但是我担心它可能是低效率的,因为这将是非向量化的循环。

我怀疑循环遍历列会更快,因为我的列总是少于行(几十列但成千上万的行)。

我想出了下面的装置。我需要整理一下并将其变成一个函数,但是它可以工作-问题是是否有一种更优雅/更快的方法?

np.where在所有项目相同时返回0,否则返回1(不是相反),因此对输出求和可以得出不匹配的数量。

我遍历所有列(不包括第一列),将它们与第一列进行比较。

第一个输出按列计数匹配/不匹配,第二个按行计数。 如果您添加类似

df.iloc[3,2] = 100

在定义df之后,输出将告诉您c列的第三行不匹配

import numpy as np
import pandas as pd


df = pd.DataFrame()
x = np.arange(0,20)
df['a'] = x
df['b'] = x
df['c'] = x
df['d'] = x

#df.iloc[3,2] = 100

cols = df.columns
out = pd.DataFrame()

for c in np.arange(1, len(cols) ):
    out[cols[c]] = np.where(df[cols[0]] == df[cols[c]], 0, 1)
    
print(out.sum(axis = 0))

print(out.sum(axis = 1))

3 个答案:

答案 0 :(得分:0)

让我们尝试duplicated

(~df.T.duplicated()).sum()==1
# True

答案 1 :(得分:0)

您可以使用df.drop_duplicates()并检查len是否为1。这意味着所有列都相同:

In [1254]: len(df.T.drop_duplicates()) == 1
Out[1254]: True

答案 2 :(得分:0)

使用DataFrame.duplicated + DataFrame.all

df.T.duplicated(keep=False).all()
#True