如何通过索引添加内容

问题描述 投票:0回答:2

看来 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 列的字符串连接行为,这是我不想要的。有办法在这里做我想做的事吗?

python-polars
2个回答
2
投票

正如 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   │
└─────┴─────┘

0
投票

另一种方法可以使用

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 │
└─────┴──────┘
© www.soinside.com 2019 - 2024. All rights reserved.