【问题标题】:Pandas throwing ValueError: Unable to coerce to Series, length must be 1: given 219Pandas 抛出 ValueError:无法强制转换为 Series,长度必须为 1:给定 219
【发布时间】:2021-05-18 11:49:50
【问题描述】:

我有一个熊猫数据框df。我想按id、type 和scenario 分组。然后计算val列的滚动平均值,并使用结果计算它的另一个版本,如下所示:

period = 120
period_2 = 12
group = df.groupby(['id', 'type', 'scenario'], as_index=False)
df['val_rolmean'] = (group['val'].rolling(period_2*2, center=True, min_periods=1).mean() * 12).reset_index(level=0, drop=True)
df['val_rolmean2'] = (group['val_rolmean']/(group['rate'].shift(period).fillna(0) + 0.0050)).reset_index(level=0, drop=True)

但它抛出了这个错误:

ValueError:无法强制转换为 Series,长度必须为 1:给定 219

我用的是熊猫版1.0.5

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我不知道这是否或多或少符合您的要求。

    由于您的df 可能包含分组列['id', 'type', 'scenario'] 的重复值,因此我创建了一个具有唯一值的数据框df_grouped。

    并将每个新的计算列添加到其中。

    我删除了参数level=0,因为在这种情况下不需要它。

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(
        np.random.randint(0,4,size=(1000, 5)), 
        columns=['id', 'type', 'scenario', 'val', 'rate'])
    
    period = 120
    period_2 = 12
    
    # Data Frame with unique lst_col_group values
    lst_col_group = ['id', 'type', 'scenario']
    mask = df[lst_col_group].drop_duplicates().index
    df_grouped = df.loc[mask]
    
    group = df.groupby(lst_col_group, as_index=False)
    
    df_grouped['val_rolmean'] = (
        group['val']
        .rolling(period_2*2, center=True, min_periods=1)
        .mean() * 12
        ).reset_index(drop=True)  # level=0 (it didn't work in this case)
    df_grouped['val_rolmean2'] = (
        df_grouped['val_rolmean']/(
            df_grouped['rate'].shift(period).fillna(0) + 0.0050)
        ).reset_index(drop=True)  # level=0 (id didn't work in this case)
    print(df_grouped.head())
    #    id  type  scenario  val  rate  val_rolmean  val_rolmean2
    # 0   3     3         3    3     1    20.000000   4000.000000
    # 1   1     1         0    1     2    21.230769   4246.153846
    # 2   1     3         1    0     1    19.714286   3942.857143
    # 3   1     0         1    2     2    20.800000   4160.000000
    # 4   2     2         3    3     0    19.500000   3900.000000
    

    【讨论】:

    • 这并不能解决我的问题,因为我想按组执行此操作,而不是在整个数据集上:group['val_rolmean']/(group['rate'].shift(period).fillna(0) + 0.0050)
    猜你喜欢
    • 2020-03-08
    • 2020-12-14
    • 2019-09-03
    • 2021-04-22
    • 1970-01-01
    • 2020-05-07
    • 2022-01-24
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多