检查熊猫数据框中所有列是否相同的快速方法是什么?
例如我有一个下面带有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))
答案 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