我有两个数据帧,看起来像这样:

df1 = pl.DataFrame(
    {
        "Name": ["A", "B", "C", "D"],
        "Year": [2001, 2003, 2003, 2004]
    }
)

df2 = pl.DataFrame(
    {
        "Name": ["A", "B", "C", "D"],
        "2001": [111, 112, 113, 114],
        "2002": [221, 222, 223, 224],
        "2003": [331, 332, 333, 334],
        "2004": [441, 442, 443, 444]
    }
)

我想对第二个df(Df2)的每一年列求和,只考虑df1中相应年份为同年或更晚的名字.所需输出:

┌──────┬──────┐
│ Year ┆  Sum │
╞══════╪══════╡
│ 2001 ┆  111 │  
│ 2002 ┆  221 │
│ 2003 ┆  996 │  (= 331 + 332 + 333)
│ 2004 ┆ 1770 │  (= 441 + 442 + 443 + 444)
└──────┴──────┘

我刚接触北极星(来自Pandas ),我不确定该怎么做.任何帮助都将不胜感激.

推荐答案

你可以用一种与df1更"兼容"的形式来表达它.它将指定的列标题"取消透视"为行.在这一点上,Year应该从str变为int列:

df2.melt(id_vars='Name', variable_name='Year').with_columns(
    pl.col('Year').cast(pl.Int64)
)

shape: (16, 3)
┌──────┬──────┬───────┐
│ Name ┆ Year ┆ value │
│ ---  ┆ ---  ┆ ---   │
│ str  ┆ i64  ┆ i64   │
╞══════╪══════╪═══════╡
│ A    ┆ 2001 ┆ 111   │
│ B    ┆ 2001 ┆ 112   │
│ C    ┆ 2001 ┆ 113   │
│ D    ┆ 2001 ┆ 114   │
│ A    ┆ 2002 ┆ 221   │
│ B    ┆ 2002 ┆ 222   │
│ C    ┆ 2002 ┆ 223   │
│ D    ┆ 2002 ┆ 224   │
│ A    ┆ 2003 ┆ 331   │
│ B    ┆ 2003 ┆ 332   │
│ C    ┆ 2003 ┆ 333   │
│ D    ┆ 2003 ┆ 334   │
│ A    ┆ 2004 ┆ 441   │
│ B    ┆ 2004 ┆ 442   │
│ C    ┆ 2004 ┆ 443   │
│ D    ┆ 2004 ┆ 444   │
└──────┴──────┴───────┘

然后,您可以使用Name上的df1对其进行join,并根据您指定的年份条件筛选结果行:

(...).join(df1, on='Name').filter(pl.col('Year') >= pl.col('Year_right'))

从那里开始,Year号公路上的groupbyagg就是一个简单的累加.总而言之:

df2.melt(id_vars='Name', variable_name='Year').with_columns(
    pl.col('Year').cast(pl.Int64)
).join(df1, on='Name').filter(pl.col('Year') >= pl.col('Year_right')).groupby(
    'Year', maintain_order=True
).agg(
    Sum=pl.col('value').sum()
)
shape: (4, 2)
┌──────┬──────┐
│ Year ┆ Sum  │
│ ---  ┆ ---  │
│ i64  ┆ i64  │
╞══════╪══════╡
│ 2001 ┆ 111  │
│ 2002 ┆ 221  │
│ 2003 ┆ 996  │
│ 2004 ┆ 1770 │
└──────┴──────┘

(maintain_order是可选的,但速度较慢,如果确实需要,可以达到与agg之后的.sort('Year')相同的效果.)

Python相关问答推荐

ValueRight:参数目标和输出必须具有相同的形状.接收:目标.形状=(无,512),输出.形状=(无,3)

如何在Python中增量更新DF

绘制系列时如何反转轴?

无法导入已安装的模块

如何让pyparparsing匹配1天或2天,但1天和2天失败?

如何在超时的情况下同步运行Matplolib服务器端?该过程随机挂起

使用polars .滤镜进行切片速度比pandas .loc慢

大Pandas 胚胎中产生组合

@Property方法上的inspect.getmembers出现意外行为,引发异常

如何避免Chained when/then分配中的Mypy不兼容类型警告?

对于一个给定的数字,找出一个整数的最小和最大可能的和

为什么这个带有List输入的简单numba函数这么慢

如何使用Python以编程方式判断和检索Angular网站的动态内容?

cv2.matchTemplate函数匹配失败

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

Python Pandas获取层次路径直到顶层管理

如何在FastAPI中为我上传的json文件提供索引ID?

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

如何更改groupby作用域以找到满足掩码条件的第一个值?

Python避免mypy在相互引用中从另一个类重定义类时失败