看来 Polars 不喜欢 Pandas 索引。
您可以使用索引执行一些我不知道如何在 Polars 中执行的操作。
例如说我有
test = pd.DataFrame({'a':['a','b'],'b':[3,4]})
和 test1 = pd.DataFrame({'a':['a','b'],'b':[4,5]})
,在 Pandas 中我可以添加这两个(其中 a 是索引列)。
在 Polars 中,当我尝试将两者相加时,我得到 a 列的字符串连接行为,这是我不想要的。有办法在这里做我想做的事吗?
正如 ritchie46 的评论中所指出的,您可以使用这样的连接:
# pandas version with index and implicit join on add
import pandas as pd
test1 = pd.DataFrame({'a':['a','b'],'b':[3,4]}).set_index('a')
test2 = pd.DataFrame({'a':['a','b'],'b':[4,5]}).set_index('a')
result = test1 + test2
print(result)
┌─────┬─────┐
│ a ┆ b │
╞═════╪═════╡
│ a ┆ 7 │
├╌╌╌╌╌┼╌╌╌╌╌┤
│ b ┆ 9 │
└─────┴─────┘
# polars version with explicit join
import polars as pl
test1 = pl.DataFrame({'a':['a','b'],'b':[3,4]})
test2 = pl.DataFrame({'a':['a','b'],'b':[4,5]})
result = test1.join(test2, on='a').select(['a', pl.col('b')+pl.col('b_right')])
print(result)
┌─────┬─────┐
│ a ┆ b │
│ --- ┆ --- │
│ str ┆ i64 │
╞═════╪═════╡
│ a ┆ 7 │
├╌╌╌╌╌┼╌╌╌╌╌┤
│ b ┆ 9 │
└─────┴─────┘
另一种方法可以使用
pl.concat()
、pl.DataFrame.group_by()
和 .GroupBy.sum()
:
(
pl.concat([test1, test2])
.group_by("a").sum()
)
hape: (2, 2)
┌─────┬─────┐
│ a ┆ b │
│ --- ┆ --- │
│ str ┆ i64 │
╞═════╪═════╡
│ b ┆ 9 │
│ a ┆ 7 │
└─────┴─────┘
但是,如果索引列中的值不匹配,为了复制 pandas 行为,我建议使用
full join
:
# pandas
test1 = pd.DataFrame({'a':['a','b','c'],'b':[3,4,5]}).set_index('a')
test2 = pd.DataFrame({'a':['a','b','d'],'b':[4,5,6]}).set_index('a')
test1 + test2
b
a
a 7.0
b 9.0
c NaN
d NaN
# polars
test1 = pl.DataFrame({'a':['a','b','c'],'b':[3,4,5]})
test2 = pl.DataFrame({'a':['a','b','d'],'b':[4,5,6]})
(
test1
.join(test2, on="a", how="full", coalesce=True)
.select("a", pl.col.b + pl.col.b_right)
)
shape: (4, 2)
┌─────┬──────┐
│ a ┆ b │
│ --- ┆ --- │
│ str ┆ i64 │
╞═════╪══════╡
│ a ┆ 7 │
│ b ┆ 9 │
│ d ┆ null │
│ c ┆ null │
└─────┴──────┘