2012-08-08 10 views
47

He una siguientes DataFrame:pandas: Combine cadena e INT columnas

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

Se ve así:

bar foo 
0 1 a 
1 2 b 
2 3 c 

Ahora quiero tener algo como:

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

¿Cómo puedo conseguir esto? He intentado lo siguiente:

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

pero me da un resultado erróneo:

>>>print df.ix[0] 

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

Lo siento por una pregunta tonta, pero éste pandas: combine two columns in a DataFrame No fue útil para mí.

Respuesta

81

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

32

El problema en su código es que desea aplicar la operación en cada fila. Sin embargo, la forma en que lo ha escrito toma todas las columnas 'bar' y 'foo', las convierte en cadenas y le devuelve una gran cadena. Se puede escribir como:

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

Es más larga que la otra respuesta, pero es más genérico (se puede utilizar con valores que no son cadenas).

9

También es posible usar

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