【问题标题】:GroupBy and Sum with a RangeIndexGroupBy 和 Sum 与 RangeIndex
【发布时间】:2020-05-19 03:54:22
【问题描述】:

我正在读取包含宽数据的 CSV,并将其转换为长数据。该数据包含 2020 年全年的每日值。我正在尝试按月汇总数据并求和。这是我尝试过的:

import pandas as pd
df = pd.read_csv('Notebooks/updated_predicted_data.csv', parse_dates=['Unnamed: 0'])
df.rename( columns={'Unnamed: 0':'yyyy_mm_dd'}, inplace=True)
df = df.melt(id_vars=['yyyy_mm_dd'])
df.rename(columns={'variable': 'name'}, inplace=True)
df.rename(columns={'value': 'predicted_value'}, inplace=True)

df['predicted_value'] = df['predicted_value'].str.replace('€', '')
df['predicted_value'] = df['predicted_value'].str.replace(',', '')
df['predicted_value'] = df['predicted_value'].astype(int)

df.dtypes

yyyy_mm_dd       datetime64[ns]
name             object
predicted_ttv    int64
dtype:           object

以上所有方法都可以正常工作,当我尝试对数据进行分组时,我遇到了问题:

sum_df = df.groupby(pd.Grouper(freq='M'))

TypeError: 仅对 DatetimeIndex、TimedeltaIndex 或 PeriodIndex 有效,但获得了 'RangeIndex' 的实例

尽管将我的日期列从字符串转换为日期时间并将预测列从字符串转换为 int,但我为什么会收到上述错误?

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    您可以在Grouper 中添加key 参数,用于通过列表中的name 列传递日期时间的列名并添加聚合函数sum

    sum_df = (df.groupby(['name',pd.Grouper(freq='M', key='yyyy_mm_dd')])['predicted_ttv']
               .sum()
               .reset_index())
    

    或者先将yyyy_mm_dd转换成DatetimeIndex

    sum_df = (df.set_index('yyyy_mm_dd')
                .groupby(['name', pd.Grouper(freq='M')])['predicted_ttv']
                .sum()
                .reset_index())
    

    【讨论】:

    • 我可以指定第二个键,以便在汇总之前将数据按yyyy_mm_ddname 分组吗?另外,这个输出<pandas.core.groupby.groupby.DataFrameGroupBy object,我怎么能把它恢复成一个普通的熊猫数据框?
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2019-09-29
    相关资源
    最近更新 更多