2016-09-29 1 views
3

Ich versuche, die String-Längen für verschiedene Spalten zu erhalten. Scheint ziemlich einfach mit:Vergleichen eines Datenrahmens auf String-Längen für verschiedene Spalten

df['a'].str.len() 

Aber ich muss es auf mehrere Spalten anwenden. Und dann mach das Minimum drauf.

Etwas wie:

df[['a','b','c']].str.len().min 

weiß, dass ich die oben nicht funktioniert, aber hoffentlich bekommen Sie die Idee. Spalte a, b, c alle enthalten Namen und ich möchte den kürzesten Namen abrufen.

Auch wegen der großen Daten vermeide ich, andere Spalten zu schaffen, um an der Größe zu sparen.

Antwort

3

Ich glaube, Sie Liste Verständnis brauchen, weil string Funktion nur mit Series (column) arbeitet:

print ([df[col].str.len().min() for col in ['a','b','c']]) 

Eine andere Lösung mit apply:

print ([df[col].apply(len).min() for col in ['a','b','c']]) 

Probe:

df = pd.DataFrame({'a':['h','gg','yyy'], 
        'b':['st','dsws','sw'], 
        'c':['fffff','','rr'], 
        'd':[1,3,5]}) 

print (df) 

    a  b  c d 
0 h st fffff 1 
1 gg dsws   3 
2 yyy sw  rr 5 

print ([df[col].str.len().min() for col in ['a','b','c']]) 
[1, 2, 0] 

Timings:

#[3000 rows x 4 columns] 
df = pd.concat([df]*1000).reset_index(drop=True) 

In [17]: %timeit ([df[col].apply(len).min() for col in ['a','b','c']]) 
100 loops, best of 3: 2.63 ms per loop 

In [18]: %timeit ([df[col].str.len().min() for col in ['a','b','c']]) 
The slowest run took 4.12 times longer than the fastest. This could mean that an intermediate result is being cached. 
100 loops, best of 3: 2.88 ms per loop 

Fazit:

apply ist schneller, aber nicht funktioniert mit None.

df = pd.DataFrame({'a':['h','gg','yyy'], 
        'b':[None,'dsws','sw'], 
        'c':['fffff','','rr'], 
        'd':[1,3,5]}) 


print (df) 
    a  b  c d 
0 h None fffff 1 
1 gg dsws   3 
2 yyy sw  rr 5 

print ([df[col].apply(len).min() for col in ['a','b','c']]) 

TypeError: object of type 'NoneType' has no len()

print ([df[col].str.len().min() for col in ['a','b','c']]) 
[1, 2.0, 0] 

EDIT von Kommentar:

#fail with None 
print (df[['a','b','c']].applymap(len).min(axis=1)) 
0 1 
1 0 
2 2 
dtype: int64 

#working with None 
print (df[['a','b','c']].apply(lambda x: x.str.len().min(), axis=1)) 
0 1 
1 0 
2 2 
dtype: int64 
+0

Hey @jezrael, sieht gut aus. Lass es mich versuchen, wenn ich zurück bin. – BernardL

+0

Danke für die Probe. Was ich versuche zu erreichen, ist jedoch auf einer Reihe Basis. Bedeutung, für a, b, c die Antwort auf eine andere Spalte lässt sagen, wird 1,0,2 – BernardL

+0

Gibt es 'None' Werte? – jezrael

Verwandte Themen