2017-10-12 15 views
0

假設我有一個數據幀如何一次通過字典中的大熊貓添加多個列

>>> df = pd.DataFrame({"body": ["abc", "def", "ghi"]}) 
>>> df 
    body 
0 abc 
1 def 
2 ghi 

,我有一個神奇的功能僅用於演示

def magic(string): 
    return {"first": string[0], "second": string[1]} 

是有辦法,我可以很快申請這個函數給df並且把所有返回的dict中的值都加回到df中(也就是說,這樣df就會有一個[「body」,「first」,「second」]的頭呢?

更新:

輸出例如:

>>> df_out 
    body first second 
0 abc  a  b 
1 def  d  e 
2 ghi  g  h 

更新1: 真正的「神奇」的功能是相當大的:這將需要一個字段中DF與LEN返回的字典〜= 100所以效率是相當重要的。

+1

你可以分享預期輸出的例子? – MedAli

+0

如果您關心性能和效率,那麼請考慮提供__reproducible__函數示例,以便我們可以嘗試找到__vectorized__解決方案... – MaxU

回答

2

您可以繼續舉例如下:

In [5]: df = pd.DataFrame({"body": ["abc", "def", "ghi"]}) 

In [6]: df 
Out[6]: 
    body 
0 abc 
1 def 
2 ghi 

In [7]: df.body.apply(lambda x: pd.Series({"first": x[0], "second": x[1]})) 
Out[7]: 
    first second 
0  a  b 
1  d  e 
2  g  h 

In [8]: df[['first','second']] = df.body.apply(lambda x: pd.Series({"first": x[0], "second": x[1]})) 

In [9]: df 
Out[9]: 
    body first second 
0 abc  a  b 
1 def  d  e 
2 ghi  g  h 

使用神奇的功能:

In [11]: df = pd.DataFrame({"body": ["abc", "def", "ghi"]}) 

In [12]: df 
Out[12]: 
    body 
0 abc 
1 def 
2 ghi 

In [13]: def magic(string): 
    ....:   return {"first": string[0], "second": string[1]} 
    ....: 

In [14]: df[['first','second']] = df.body.apply(lambda x: pd.Series(magic(x))) 
In [15]: df 
Out[15]: 
    body first second 
0 abc  a  b 
1 def  d  e 
2 ghi  g  h 

編輯: 按在你的問題評論b elow,您可以使用df.join不具有明確寫入列的名稱:

In [39]: df.join(df.body.apply(lambda x: pd.Series(magic(x)))) 
Out[39]: 
    body first second 
0 abc  a  b 
1 def  d  e 
2 ghi  g  h 
+0

謝謝!有沒有一種方法可以:1)使用我的函數2)不要像在[14]中那樣顯式地寫列,即[「first」,「second」],因爲我有100個返回值? –

+0

@ Mr.cysl爲你做了編輯工作? – MedAli

3

我會做這種方式:

In [4]: df[['first','second']] = df.body.str.extract(r'(.)(.)', expand=True) 

In [5]: df 
Out[5]: 
    body first second 
0 abc  a  b 
1 def  d  e 
2 ghi  g  h