如何在pandas

时间:2017-10-12 20:10:20

标签: python pandas

假设我有一个数据框

>>> 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",& #34;第一个","第二个"]?

更新:

输出示例:

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

更新1: 真正的魔法"函数非常大:它将在df中占用一个字段并返回一个len~ = 100的字典。因此效率很重要。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

修改 根据您在下面的评论中的问题,您可以使用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