【问题标题】:Pandas list unpacking to multiple columns熊猫列表解包到多列
【发布时间】:2023-02-26 05:02:59
【问题描述】:

我有一个 pandas DataFrame,其中一列包含列表,例如:

>>> import pandas as pd
>>> d = {'A': [1, 2, 3], 'B': [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9]]}
>>> df = pd.DataFrame(data=d)
>>> df
   A                B
0  1  [0.1, 0.2, 0.3]
1  2  [0.4, 0.5, 0.6]
2  3  [0.7, 0.8, 0.9]

我可以将这些列表解压缩到单独的列

>>> df[['x','y','z']] = df.B.tolist()
>>> df
   A                B    x    y    z
0  1  [0.1, 0.2, 0.3]  0.1  0.2  0.3
1  2  [0.4, 0.5, 0.6]  0.4  0.5  0.6
2  3  [0.7, 0.8, 0.9]  0.7  0.8  0.9

但想用链接兼容的命令来做到这一点。

我想过使用.assign,但在这里我需要明确定义每个变量,并且通过 lambdas 解包有点涉及。

>>> (df.assign(q=lambda df_: df_.B.apply(lambda x: x[0]),
...            w=lambda df_: df_.B.apply(lambda x: x[1]),
...            u=lambda df_: df_.B.apply(lambda x: x[2])))
   A                B    q    w    u
0  1  [0.1, 0.2, 0.3]  0.1  0.2  0.3
1  2  [0.4, 0.5, 0.6]  0.4  0.5  0.6
2  3  [0.7, 0.8, 0.9]  0.7  0.8  0.9

有一个更好的方法吗?

【问题讨论】:

  • 顺便说一句,你可以在没有apply的情况下使用.assign(q=lambda d: d['B'].str[0])对列表进行切片;)

标签: python pandas chaining iterable-unpacking


【解决方案1】:

pipe 对链接任何东西总是有用的:

(pd.DataFrame(d)
   .pipe(lambda d: d.join(pd.DataFrame(d['B'].to_list(),
                                       columns=['q', 'w', 'u'],
                                       index=d.index))
        )
)

pipe+assign 的变体:

df.pipe(lambda d: d.assign(**dict(zip(['q', 'w', 'u'], zip(*d['B'].to_list())))))

输出:

   A                B    q    w    u
0  1  [0.1, 0.2, 0.3]  0.1  0.2  0.3
1  2  [0.4, 0.5, 0.6]  0.4  0.5  0.6
2  3  [0.7, 0.8, 0.9]  0.7  0.8  0.9

【讨论】:

  • 通过pipe 完成它是个好主意,非常感谢@mozway! pipe+assign 变体对于生产代码来说可能有点老套,但是您就地创建 dict 的想法真的很酷。
【解决方案2】:

以@mozway 的重要提示为基础,有两个简化:

使用zipassign内创建一个dict

df.assign(**dict(zip(['x', 'y', 'z'], zip(*df['B']))))

【讨论】:

    猜你喜欢
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2021-03-21
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多