2016-06-24 20 views
0

Ich versuche zu verwenden, um eine neue Spalte in einem Pandas DataFrame zu erstellen. Ich muss etwas wie str.format verwenden, damit die neue Spalte Teile vorhandener Spalten ist. Zum Beispiel ...pandas DataFrame mit Format zuweisen

import pandas as pd 
df = pd.DataFrame(np.random.randn(3, 3)) 

gibt mir ...

   0   1   2 
    0 -0.738703 -1.027115 1.129253 
    1 0.674314 0.525223 -0.371896 
    2 1.021304 0.169181 -0.884293 

ein assign für eine völlig neue Spalte arbeitet

# works 
print(df.assign(c = "a")) 

       0   1   2 c 
    0 -0.738703 -1.027115 1.129253 a 
    1 0.674314 0.525223 -0.371896 a 
    2 1.021304 0.169181 -0.884293 a 

Aber, wenn ich eine vorhandene Spalte verwenden möchten, in eine neue Spalte scheint es, als würde Pandas den ganzen existierenden Rahmen in die neue Spalte einfügen.

# doesn't work 
print(df.assign(c = "a{}b".format(df[0]))) 

       0   1   2 \ 
    0 -0.738703 -1.027115 1.129253 
    1 0.674314 0.525223 -0.371896 
    2 1.021304 0.169181 -0.884293 

                 c 
    0 a0 -0.738703\n1 0.674314\n2 1.021304\n... 
    1 a0 -0.738703\n1 0.674314\n2 1.021304\n... 
    2 a0 -0.738703\n1 0.674314\n2 1.021304\n... 

Danke für die Hilfe.

Antwort

0
In [131]: df.assign(c="a"+df[0].astype(str)+"b") 
Out[131]: 
      0   1   2     c 
0 0.833556 -0.106183 -0.910005 a0.833556419295b 
1 -1.487825 1.173338 1.650466 a-1.48782514804b 
2 -0.836795 -1.192674 -0.212900 a-0.836795026809b 

'a{}b'.format(df[0]) ist ein str. "a"+df[0].astype(str)+"b" ist eine Serie.

In [142]: type(df[0].astype(str)) 
Out[142]: pandas.core.series.Series 

In [143]: type('{}'.format(df[0])) 
Out[143]: str 

Wenn Sie eine einzelne Zeichenfolge in die Spalte c zuweisen, wird diese Zeichenfolge für jede Zeile in df wiederholt. So ordnet df.assign(c = "a{}b".format(df[0])) die Zeichenfolge 'a{}b'.format(df[0]) zu jeder Reihe von df:

In [138]: 'a{}b'.format(df[0]) 
Out[138]: 'a0 0.833556\n1 -1.487825\n2 -0.836795\nName: 0, dtype: float64b' 

Es ist wirklich nicht anders als das, was mit df.assign(c = "a") passiert ist. Wenn Sie der Spalte c eine Reihe zuweisen, wird der Index der Serie mit dem Index df ausgerichtet und die entsprechenden Werte werden df['c'] zugewiesen.


Unter der Haube wird das Series.__add__ Verfahren so definiert, so dass die Zugabe der Serie Strings mit einem String-Ergebnissen in einer neuen Serie mit dem String verkettet mit den Werten in der Serie enthält:

In [149]: "a"+df[0].astype(str) 
Out[149]: 
0  a0.833556419295 
1  a-1.48782514804 
2 a-0.836795026809 
Name: 0, dtype: object 

(Die astype wurde Methode aufgerufen, um den Schwimmer in df[0] in Strings zu konvertieren.)

+0

cool, dass es zwei Möglichkeiten gibt um die Antwort zu erreichen. Zur Erbauung, warum formatiert Arbeit nicht? – tayknight

0
df['c'] = "a" + df[0].astype(str) + 'b' 
df 


     0 1 2 c 
0 -1.134154 -0.367397 0.906239 a-1.13415403091b 
1 0.551997 -0.160217 -0.869291 a0.551996920472b 
2 0.490102 -1.151301 0.541888 a0.490101854737b