2016-12-01 1 views
2

ich ein Datenrahmen df der Form haben:Bewerben str.lower auf Pandas über Liste Auffassungs

animal fruit 
0 "Dog" "Apple" 
1 "Cat" "Banana" 
2 "Rat" "Grape" 

Ich möchte str.lower() auf alle Spalten anwenden (aber nicht Header).

Dieses Werk:

for i in df: 
    df[i] = df[i].str.lower() 

Wie kann ich dies als eine Liste comphrension schreiben?

Ich habe versucht:

df[i] = [df[i].str.lower() for i in df] 

Aber das funktioniert nicht und ich bekomme ein:

TypeError: list indices must be integers, not instancemethod 

Was muss ich in der Liste Verständnis für diese Änderung zu arbeiten?

Zweitens gibt es einen "Pandas-Onicy" Weg, dies im Allgemeinen zu tun, vielleicht mit der Funktion pandas.apply()?

Vielen Dank für Ihre Hilfe.

Antwort

2

Ausgabe von Liste Verständnis ist Liste von Series. So müssen concatlist:

L = [df[i].str.lower() for i in df] 
print (L) 
[0 dog 
1 cat 
2 rat 
Name: animal, dtype: object, 0  apple 
1 banana 
2  grape 
Name: fruit, dtype: object] 

df1 = pd.concat(L, axis=1) 
print (df1) 
    animal fruit 
0 dog apple 
1 cat banana 
2 rat grape 

Lösung mit apply:

print (df.apply(lambda x: x.str.lower())) 
    animal fruit 
0 dog apple 
1 cat banana 
2 rat grape 

Timings:

df = pd.concat([df]*1000).reset_index(drop=True) 
df = pd.concat([df]*1000, axis=1) 
df.columns = range(len(df.columns)) 
#[3000 rows x 2000 columns] 
print (df) 

In [89]: %timeit (pd.concat([df[i].str.lower() for i in df], axis=1)) 
1 loop, best of 3: 2.3 s per loop 

In [90]: %timeit (df.apply(lambda x: x.str.lower())) 
1 loop, best of 3: 2.63 s per loop 

In [91]: %timeit (df.stack().str.lower().unstack()) 
1 loop, best of 3: 5.04 s per loop 
+0

Danke, so die ** ** concat würde auf einem Pandas d Rahmen tun jede Liste Verständnis auf diese Weise erforderlich sein? – Chuck

+1

Wenn Sie die Funktion 'Series' verwenden wollen, wie 'str.lower()', dann brauchen Sie die concat-Methode mit List-Verständnis, die am schnellsten ist. – jezrael

+0

Ah Ok, danke. Sehr geschätzt. – Chuck

1

können Sie stack so, dass es eine einzige Spalte macht, dann rufen str.lower, und dann unstack die Spalten zurück wiederherzustellen:

In [74]: 
df = df.stack().str.lower().unstack() 
df 

Out[74]: 
    animal fruit 
0 dog apple 
1 cat banana 
2 rat grape 
+0

Vielen Dank für Ihre Hilfe - es gibt viele dieser Funktionen zu lernen. – Chuck