2012-08-08 10 views
47

Mam następujące DataFrame:Pandy: Kombajny ciąg i int kolumny

from pandas import * 
df = DataFrame({'foo':['a','b','c'], 'bar':[1, 2, 3]}) 

Wygląda to tak:

bar foo 
0 1 a 
1 2 b 
2 3 c 

Teraz chcę mieć coś takiego:

 bar 
0 1 is a 
1 2 is b 
2 3 is c 

Jak mogę to osiągnąć? Próbowałem następujące:

df['foo'] = '%s is %s' % (df['bar'], df['foo']) 

ale daje mi zły wynik:

>>>print df.ix[0] 

bar             a 
foo 0 a 
1 b 
2 c 
Name: bar is 0 1 
1 2 
2 
Name: 0 

Przepraszam za głupie pytanie, ale ten pandas: combine two columns in a DataFrame nie był pomocny dla mnie.

Odpowiedz

81

df['bar'] = df.bar.map(str) + " is " + df.foo.

32

Problem w kodzie polega na tym, że chcesz zastosować operację w każdym wierszu. Sposób, w jaki to napisałeś, zajmuje całe kolumny "bar" i "foo", zamienia je na ciągi i daje ci jeden duży ciąg. Możesz napisać tak:

df.apply(lambda x:'%s is %s' % (x['bar'],x['foo']),axis=1) 

Jest dłuższy niż druga odpowiedź, ale jest bardziej ogólny (może być używany z wartościami, które nie są ciągami).

9

Można również użyć

df['bar'] = df['bar'].str.cat(df['foo'].values.astype(str), sep=' is ') 
3
df.astype(str).apply(lambda x: ' is '.join(x), axis=1) 

0 1 is a 
1 2 is b 
2 3 is c 
dtype: object