2016-07-29 75 views
3

我有数据的熊猫数据帧中给定列中的所有行必须匹配:给定列中的所有行必须匹配,所有列

df = pd.DataFrame({'A': [1,1,1,1,1,1,1,1,1,1], 
        'B': [2,2,2,2,2,2,2,2,2,2], 
        'C': [3,3,3,3,3,3,3,3,3,3], 
        'D': [4,4,4,4,4,4,4,4,4,4], 
        'E': [5,5,5,5,5,5,5,5,5,5]}) 

In [10]: df 
Out[10]: 
    A B C D E 
0 1 2 3 4 5 
1 1 2 3 4 5 
2 1 2 3 4 5 
... 
6 1 2 3 4 5 
7 1 2 3 4 5 
8 1 2 3 4 5 
9 1 2 3 4 5 

我想一个快速的方法来知道是否有是DataFrame中任何地方的差异。在这一点上,我不需要知道哪些值已经变化,因为我将在稍后处理这些值。我只需要一个快速的方法来知道DataFrame是否需要进一步关注,或者我是否可以忽略它并继续下一步。

我可以检查使用

(df.loc[:,'A'] != df.loc[0,'A']).any() 

任何给定的列,但我的大熊猫知识限制我通过列迭代(我的理解迭代的熊猫令人难以接受的)比较所有的人:

A B C D E 
0 1 2 3 4 5 
1 1 2 9 4 5 
2 1 2 3 4 5 
... 
6 1 2 3 4 5 
7 1 2 3 4 5 
8 1 2 3 4 5 
9 1 2 3 4 5 

for col in df.columns: 
    if (df.loc[:,col] != df.loc[0,col]).any(): 
     print("Found a fail in col %s" % col) 
     break 

Out: Found a fail in col C 

如果数据框的任何列中的任何行与列中的所有值都不匹配,是否有优雅的方式来返回布尔值?可能没有迭代?

回答

4

考虑您的示例数据帧:

df = pd.DataFrame({'A': [1,1,1,1,1,1,1,1,1,1], 
        'B': [2,2,2,2,2,2,2,2,2,2], 
        'C': [3,3,3,3,3,3,3,3,3,3], 
        'D': [4,4,4,4,4,4,4,4,4,4], 
        'E': [5,5,5,5,5,5,5,5,5,5]}) 

您可以使用以下方法:

df.apply(pd.Series.nunique) > 1 

它给你:

A False 
B False 
C False 
D False 
E False 
dtype: bool 

如果我们再用力一对夫妇的错误:

df.loc[3, 'C'] = 0 
df.loc[5, 'B'] = 20 

然后,您可以:

A False 
B  True 
C  True 
D False 
E False 
dtype: bool 
+0

到目前为止,所有的方法都能正常工作,但我认为使用nunique()将会是代码读者(我)正在做的事情的一个很好的暗示。 –

2

您可以使用apply遍历列,并检查是否在列中的所有元素都是相同的:

df.apply(lambda col: (col != col[0]).any()) 

# A False 
# B False 
# C False 
# D False 
# E False 
# dtype: bool 
+0

感谢您指出apply()。看起来我需要将它添加到我的工具包中。 –

4

您可以将整个数据框比较的第一行是这样的:

In [11]: df.eq(df.iloc[0], axis='columns') 
Out[11]: 
     A  B  C  D  E 
0 True True True True True 
1 True True True True True 
2 True True True True True 
3 True True True True True 
4 True True True True True 
5 True True True True True 
6 True True True True True 
7 True True True True True 
8 True True True True True 
9 True True True True True 
然后测试所有值是否为真:
In [13]: df.eq(df.iloc[0], axis='columns').all() 
Out[13]: 
A True 
B True 
C True 
D True 
E True 
dtype: bool 

In [14]: df.eq(df.iloc[0], axis='columns').all().all() 
Out[14]: True 
+0

好主意。我没有想到要朝这个方向看问题。你对熊猫有很高的技巧。请问你使用熊猫多久了? –

相关问题