【问题标题】:Python pandas: Applying rolling sum on pivot tablePython pandas:在数据透视表上应用滚动总和
【发布时间】:2020-11-24 01:14:02
【问题描述】:

我使用 pivot_table 命令创建了一个数据框。数据框有 351 行和 120 列。数据框如下所示:

RY          2011                                              ...   2020
Month   1   2   3   4   5   6   7   8   9   10  ... 3   4   5   6   7   8   9   10  11  12
ID                                                                                  
AB10    0   0   0   0   0   0   0   0   0   0   ... 0   0   0   0   0   0   0   0   0   0
AB1286  0   0   0   0   2   0   0   0   0   0   ... 0   0   0   0   0   0   0   0   0   0
AB1951  0   0   0   0   0   0   0   0   0   0   ... 0   0   0   0   0   0   0   0   0   0
AB2 0   0   0   0   0   0   0   0   0   0   ... 0   0   0   0   0   0   0   0   0   0
AB2338  0   0   0   0   0   0   0   0   0   0   ... 0   0   0   0   0   0   0   0   0   0

现在我想计算 ID 的 12 个月的滚动总和。我写了以下命令来计算滚动和:

df.groupby('ID').rolling(12,on='Month').sum()

但是,它给出了以下错误:

ValueError: invalid on specified as Month, must be a column (of DataFrame), an Index or None

谁能帮我解决这个问题?

【问题讨论】:

  • 您原来的pandas.DataFrame 列是什么样的?是["Year", "Month", "ID", "value"]吗?使用该布局来获得所需的结果可能更简单。
  • @AlexFortin 是的,实际数据框是 ["Year", "Month", "ID", "value"]。我转换为数据透视表的原因是我想获得从 2011 年到 2020 年期间的滚动总和。很少有 ID 没有几年或几个月的数据

标签: python python-3.x pandas


【解决方案1】:

“ID”包含什么?您是否尝试过使用转置数据透视表?

df.T.groupby('ID').rolling(12,on='Month').sum()

【讨论】:

    【解决方案2】:

    尝试在创建数据透视表之前运行该代码。但是,请确保您首先使用以下内容创建日期时间列:

    df['Date'] = pd.to_datetime(df['Year'].astype(str) + '-' + df['Month'].astype(str) + '-01')

    然后:

    df.groupby('ID').rolling(12,on='Date').sum()

    【讨论】:

    • 我喜欢您将年份和月份转换为日期的想法。但是,我仍然需要创建数据透视表。因为,一些 ID 可能在某些日期没有数据。所以为了避免丢失详细信息,我想创建数据透视表。在我运行第二个命令时在 ID 和日期上创建数据透视表后,它会抛出此错误“在指定为日期时无效,必须是(DataFrame 的)列、索引或无”
    • 您可能需要使用pd.MultiIndex.from_product()重新索引数据
    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 2023-03-23
    • 2021-08-24
    • 2020-08-30
    • 2018-09-02
    相关资源
    最近更新 更多