2016-07-29 12 views
3

ich Pandas Datenrahmen von Daten, in denen haben alle Zeilen innerhalb einer bestimmten Spalte übereinstimmen müssen:Alle Zeilen innerhalb einer bestimmten Spalte müssen übereinstimmen, für alle Spalten

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 

ich eine schnelle Art und Weise zu wissen, würde, wenn es ist eine Abweichung irgendwo im DataFrame. An dieser Stelle muss ich nicht wissen, welche Werte sich geändert haben, da ich später darauf eingehen werde. Ich brauche nur einen schnellen Weg, um zu wissen, ob der DataFrame weitere Aufmerksamkeit benötigt oder ob ich ihn ignorieren kann und mit dem nächsten fortfahren kann.

kann ich überprüfen, jede gegebene Spalte

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

aber meine Pandas Wissen begrenzt mich durch die Spalten iterieren (I Iteration verstehen auf in Pandas verpönt), alle von ihnen zu vergleichen:

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 

Gibt es eine elegante Möglichkeit, einen booleschen Wert zurückzugeben, wenn irgendeine Zeile innerhalb einer Spalte eines Datenrahmens nicht mit allen Werten in der Spalte übereinstimmt ... möglicherweise ohne Iteration?

Antwort

4

Bei Ihrem Beispiel Datenrahmen:

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]}) 

Sie folgendes verwenden:

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

Welche gibt Ihnen:

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

Wenn wir dann ein paar Fehler erzwingen:

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

Sie erhalten dann:

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

Alle bisherigen Ansätze würden gut funktionieren, aber ich denke, dass das Verwenden von nunique() ein guter Hinweis für den Codeleser (mich) sein wird, was getan wird. –

2

Sie können apply eine Schleife durch Spalten verwenden und überprüfen, ob alle Elemente in der Spalte gleich sind:

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

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

Danke für das Aufzeigen apply(). Sieht so aus, als müsste ich das zu meiner Werkzeugtasche hinzufügen. –

4

Sie können den gesamten Datenrahmen in die erste Zeile wie folgt vergleichen:

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 

dann testen, ob alle Werte wahr sind:

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

Gute Idee. Ich hatte nicht gedacht, das Problem in diese Richtung zu betrachten. Du hast eine große Fähigkeit mit Pandas. Darf ich fragen, wie lange du schon Pandas benutzt hast? –

Verwandte Themen