将 pandas 函数应用于列以创建多个新列?

新手上路,请多包涵

如何在熊猫中做到这一点:

我在单个文本列上有一个函数 extract_text_features ,返回多个输出列。具体来说,该函数返回 6 个值。

该函数有效,但是似乎没有任何正确的返回类型(pandas DataFrame/numpy 数组/Python 列表),因此可以正确分配输出 df.ix[: ,10:16] = df.textcol.map(extract_text_features)

所以我想我需要回到迭代 df.iterrows() ,按照 这个

更新:迭代 df.iterrows() 至少慢 20 倍,所以我放弃并将函数拆分为六个不同的 .map(lambda ...) 调用。

更新 2:在可用性 df.apply 得到改进或 df.assign()添加到 v0.16 之前,这个问题在 v0.11.0 左右被问到。因此,很多问题和答案都不太相关。

原文由 smci 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 313
2 个回答

根据 user1827356 的回答,您可以使用 df.merge 一次性完成作业:

 df.merge(df.textcol.apply(lambda s: pd.Series({'feature1':s+1, 'feature2':s-1})),
    left_index=True, right_index=True)

    textcol  feature1  feature2
0  0.772692  1.772692 -0.227308
1  0.857210  1.857210 -0.142790
2  0.065639  1.065639 -0.934361
3  0.819160  1.819160 -0.180840
4  0.088212  1.088212 -0.911788

编辑: 请注意巨大的内存消耗和低速: https ://ys-l.github.io/posts/2015/08/28/how-not-to-use-pandas-apply/ !

原文由 Zelazny7 发布,翻译遵循 CC BY-SA 4.0 许可协议

我通常使用 zip 来做到这一点:

 >>> df = pd.DataFrame([[i] for i in range(10)], columns=['num'])
>>> df
    num
0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9

>>> def powers(x):
>>>     return x, x**2, x**3, x**4, x**5, x**6

>>> df['p1'], df['p2'], df['p3'], df['p4'], df['p5'], df['p6'] = \
>>>     zip(*df['num'].map(powers))

>>> df
        num     p1      p2      p3      p4      p5      p6
0       0       0       0       0       0       0       0
1       1       1       1       1       1       1       1
2       2       2       4       8       16      32      64
3       3       3       9       27      81      243     729
4       4       4       16      64      256     1024    4096
5       5       5       25      125     625     3125    15625
6       6       6       36      216     1296    7776    46656
7       7       7       49      343     2401    16807   117649
8       8       8       64      512     4096    32768   262144
9       9       9       81      729     6561    59049   531441

原文由 ostrokach 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题