2016-06-24 168 views
0

我試圖用assign來在熊貓數據框中創建一個新列。我需要使用類似str.format的東西來讓新的列成爲現有的列。例如...熊貓DataFrame分配格式

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

給我...

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

一個全新的列中的分配工作

# 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 

但是,如果我想使用的現有列進一個新的專欄似乎是熊貓將整個現有框架添加到新專欄中。

# 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... 

感謝您的幫助。

回答

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])str"a"+df[0].astype(str)+"b"是一個系列。

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

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

當你將一個字符串列c,該字符串在df重複每一行。 因此,df.assign(c = "a{}b".format(df[0]))字符串'a{}b'.format(df[0]) 分配的df每一行:

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

它比用df.assign(c = "a")發生了什麼事真的沒有什麼不同。

相反,當您將系列分配到列c時,則系列的索引與索引df對齊,並將相應的值分配給df['c']


引擎蓋下,該Series.__add__方法以這樣的方式定義,使得除了含有與弦級聯與所述系列的值的新系列用字符串結果串系列:

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

(該astype方法被調用到彩車轉換成df[0]成字符串。)

+0

酷有兩種方式完成答案。爲了啓發,爲什麼格式不工作? – 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