2016-07-29 72 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

好主意。我沒有想到要朝這個方向看問題。你對熊貓有很高的技巧。請問你使用熊貓多久了? –

相關問題