我想知道是否有更简单/更快的方法(理想的管道方法,这样看起来更好!)我可以计算出滚动差除以前一组总和.在结果输出中,pc列是我要查找的列.

import pandas as pd

df = pd.DataFrame(
    {
        "Date": ["2020-01-01", "2020-01-01", "2020-01-01", "2021-01-01", "2021-01-01", "2021-01-01", "2022-01-01", "2022-01-01", "2022-01-01"],
        "City": ["London", "New York", "Tokyo", "London", "New York", "Tokyo", "London", "New York", "Tokyo"],
        "Pop": [90, 70, 60, 85, 60, 45, 70, 40, 32],
    }
)

         Date      City  Pop
0  2020-01-01    London   90
1  2020-01-01  New York   70
2  2020-01-01     Tokyo   60
3  2021-01-01    London   85
4  2021-01-01  New York   60
5  2021-01-01     Tokyo   45
6  2022-01-01    London   70
7  2022-01-01  New York   40
8  2022-01-01     Tokyo   32
df['pop_diff'] = df.groupby(['City'])['Pop'].diff()
df['total'] = df.groupby('Date').Pop.transform('sum')
df['total_shift'] = df.groupby('City')['total'].shift()
df['pc'] = df['pop_diff'] / df['total_shift']

         Date      City  Pop  pop_diff  total  total_shift        pc
0  2020-01-01    London   90       NaN    220          NaN       NaN
1  2020-01-01  New York   70       NaN    220          NaN       NaN
2  2020-01-01     Tokyo   60       NaN    220          NaN       NaN
3  2021-01-01    London   85      -5.0    190        220.0 -0.022727
4  2021-01-01  New York   60     -10.0    190        220.0 -0.045455
5  2021-01-01     Tokyo   45     -15.0    190        220.0 -0.068182
6  2022-01-01    London   70     -15.0    142        190.0 -0.078947
7  2022-01-01  New York   40     -20.0    142        190.0 -0.105263
8  2022-01-01     Tokyo   32     -13.0    142        190.0 -0.068421

推荐答案

以下是对Pandas assignpipe做到这一点的一个方法:

df = (
    df.assign(total=df.groupby("Date")["Pop"].transform("sum"))
    .pipe(
        lambda df_: df_.assign(
            pc=df_.groupby(["City"])
            .agg({"Pop": "diff", "total": "shift"})
            .pipe(lambda x: x["Pop"] / x["total"])
        )
    )
    .drop(columns="total")
)

然后:

print(df)
# Output
         Date      City  Pop        pc
0  2020-01-01    London   90       NaN
1  2020-01-01  New York   70       NaN
2  2020-01-01     Tokyo   60       NaN
3  2021-01-01    London   85 -0.022727
4  2021-01-01  New York   60 -0.045455
5  2021-01-01     Tokyo   45 -0.068182
6  2022-01-01    London   70 -0.078947
7  2022-01-01  New York   40 -0.105263
8  2022-01-01     Tokyo   32 -0.068421

Python相关问答推荐

导入错误:无法导入名称';操作';

OpenCV轮廓.很难找到给定图像的所需轮廓

如何在Gekko中使用分层条件约束

如何求相邻对序列中元素 Select 的最小代价

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

如何在PythonPandas 中对同一个浮动列进行逐行划分?

仅取消堆叠最后三列

将像素信息写入文件并读取该文件

是否需要依赖反转来确保呼叫方和被呼叫方之间的分离?

两个名称相同但值不同的 Select 都会产生相同的值(discord.py)

将时间序列附加到数据帧

如何将ManyToManyfield用于Self类

如何导入与我试图从该目录之外运行的文件位于同一目录中的Python文件?

在Python中使用unittest中的补丁进行动态模拟

将COLUMN BY GROUP中的值连接为列表,并将其赋值给PANAS数据框中的变量

在Python中比较函数参数和回调函数的正确方法

Pandas/NumPy:当行值是行值的倍数时重置滚动平均值,最小尺寸

如何在Pandas 分组处理中执行多个功能

使用通配符标识扩展名为的文件

从Pandas Dataframe导出Excel透视表