1

我想将多个列作为一个列表组合成一个列。

例如,这个数据框:

┌─────┬─────┐
│ a   ┆ b   │
│ --- ┆ --- │
│ i64 ┆ i64 │
╞═════╪═════╡
│ 1   ┆ 4   │
├╌╌╌╌╌┼╌╌╌╌╌┤
│ 2   ┆ 5   │
├╌╌╌╌╌┼╌╌╌╌╌┤
│ 3   ┆ 6   │
└─────┴─────┘

进入这个:

┌────────────┐
│ combine    │
│ ---        │
│ list [i64] │
╞════════════╡
│ [1, 4]     │
├╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [2, 5]     │
├╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [3, 6]     │
└────────────┘

现在我正在这样做:

df = df.with_column(pl.map(['a','b'],lambda df:pl.Series(np.column_stack([df[0].to_numpy(),df[1].to_numpy()]).tolist())).alias('combine'))

有更好的方法吗?

4

2 回答 2

1

随着这个PR的落地,我们可以reshapeaSeries/Expr变成aSeries/Expr的类型了List。然后这些可以是concatenated每行。

df = pl.DataFrame({
    "a": [1, 2, 3],
    "b": [4, 5, 6]
})


df.select([
    pl.concat_list([
        pl.col("a").reshape((-1, 1)), 
        pl.col("b").reshape((-1, 1))
    ])
])

输出:

shape: (3, 1)
┌────────────┐
│ a          │
│ ---        │
│ list [i64] │
╞════════════╡
│ [1, 4]     │
├╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [2, 5]     │
├╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [3, 6]     │
└────────────┘

请注意,我们给出了 shape (-1, 1),其中-1的意思是推断尺寸大小。所以这读作(infer the rows, 1 column).

您可以从源代码编译 Polars 以使用此新功能,或者等待几天然后将其登陆 PyPi。

于 2021-11-25T19:35:04.590 回答
0

试试这个:

df.apply(list, axis=1)

在这里你可以看到一个例子:

>>> import pandas as pd
>>> df = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})
>>> df
   a  b
0  1  4
1  2  5
2  3  6
>>> df.apply(list, axis=1)
0    [1, 4]
1    [2, 5]
2    [3, 6]
于 2021-11-25T14:44:37.577 回答