2016-04-20 16 views
2

Normalerweise man filtert ein Pandas Datenrahmen wie folgt:Fehlerfilterlisten in Pandas Datenrahmen

import pandas as pd 
df = pd.read_csv(...) 
df_filtered = df[df['column'] == value] 

Ich habe folgende Datenrahmen df1:

numbers letters other_columns 
0   [A]  .... 
1   [A]  .... 
2   [C]  .... 
3   [B]  .... 
4   [B]  .... 
5   [A]  .... 
...  .... 

Ich dachte, dass die Einträge in letters Saiten waren, aber das sind eigentlich Listen:

type(df1.letters.ix[0]) 

Ausgänge list

Also habe ich versucht, den Datenrahmen df1 zu filtern, nur [A] Reihen zu haben.

Das only_A aussehen soll ist: Jedoch

numbers letters other_columns 
0   [A]  .... 
1   [A]  .... 
5   [A]  .... 
...  .... 

, wenn ich mit dem Code zu filtern versuchen

only_A = df1[df1['letters'] == list('A')] 

ich einen Fehler, ein ValueError

ValueError: Arrays were different lengths: 3076 vs 1 

Was ist der richtige Weg, um diesen Datenrahmen zu filtern?

+0

Welchen Fehler bekommen Sie? –

+0

Wenn Sie dachten, dass der Inhalt von Buchstaben Strings wären, könnten Sie die Spalte von Listen in Strings konvertieren? etwas wie das: df ['letters'] = df ['letters']. apply (lambda x: '' .join (x)) Dann fahre fort zu filtern wie du es normalerweise tun würdest. – flyingmeatball

+0

Benötigen Sie Listen für diese Serie? Wenn nicht, könnten Sie die Buchstaben auspacken und dann einen normalen Filter auf den fraglichen Brief machen. – rshield

Antwort

2

Sie Series.str.join können die Filterung ohne Änderung der Datenrahmen zu tun.

df[df['letters'].str.join('') == 'A'] 
+0

Da man den DataFrame nicht ändern muss, muss ich mit dieser Antwort gehen. – ShanZhengYang

2

Wenn Sie dachten, dass der Inhalt von Buchstaben Strings wären, könnten Sie die Spalte von Listen in Strings konvertieren? so etwas wie dieses:

df['letters'] = df['letters'].apply(lambda x: ''.join(x)) 

Dann gehen Sie zu filtern, wie Sie normalerweise