如何通过pandas中的dict一次添加多列

Mr.*_*ysl 5 python pandas

假设我有一个数据框

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

我有一个用于演示的神奇功能

def magic(string):
    return {"first": string[0], "second": string[1]}
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以快速将此函数应用于 df 并将返回字典中的所有值添加回 df (即,因此 df 将具有 [“body”,“first”,“second”] 的头部?

更新:

输出示例:

>>> df_out
  body first second
0  abc     a      b
1  def     d      e
2  ghi     g      h
Run Code Online (Sandbox Code Playgroud)

更新 1:真正的“神奇”函数相当大:它将占用 df 中的一个字段并返回一个 len ~= 100 的字典。因此效率非常重要。

Moh*_*OUI 5

例如,您可以按如下方式进行:

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
Run Code Online (Sandbox Code Playgroud)

使用你的魔法功能:

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
Run Code Online (Sandbox Code Playgroud)

编辑: 根据下面评论中的问题,您可以使用 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
Run Code Online (Sandbox Code Playgroud)