2017-01-16 4 views
1

Ich habe eine Pandas DataFrame (df), die ich für ein Semikolon suchen muss. Ich versuchte zunächst, mitPandas - Suche nach einem Zeichen in einem DataFrame

semicolon_check = df.to_string().__contains__(';'),

aber es ist sehr langsam und bei großen Datenrahmen Ich laufe in einen Speicherfehler. Dann habe ich versucht, eine Schleife über Spalten mit .str, aber nicht alle Spalten sind Strings so, wenn ich eine numerische Spalte erreichte ich einen Fehler empfangen

AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas

so landete ich mit diesem Code auf

for col in df.columns: if df[col].dtype == 'O': if df[col].str.contains(r';').any(): print 'found in ' + col

Gibt es einen einfacheren Weg, um das Ziel zu erreichen? Obiges funktioniert, obwohl es wie erwartet funktioniert, für eine so elementare Aufgabe wie die Wertesuche etwas zu viel Aufwand.

+0

Dies ist möglicherweise nicht der effizienteste Weg, aber es läuft sicher. – Abdou

Antwort

5

Sie können nur filtern reiht Spalten select_dtypes mit und apply dann anrufen und eine lambda passieren str.contains rufen mit any:

In [33]: 
# create a test df 
df = pd.DataFrame({'int':np.arange(5), 'str':['a','a;a',';','b','c'], 'flt':np.random.randn(5), 'other str':list('abcde')}) 
df 

Out[33]: 
     flt int other str str 
0 1.020561 0   a a 
1 0.022842 1   b a;a 
2 -1.207961 2   c ; 
3 1.092960 3   d b 
4 -1.560300 4   e c 

In [35]: 
# filter on dtype 
test = df.select_dtypes([np.object]).apply(lambda x: x.str.contains(';').any()) 
test 

Out[35]: 
other str False 
str   True 
dtype: bool 

Wir haben die Spalten-Array aus dem gefilterten können df zusammen mit der Maske die filtern cols:

Verwandte Themen