【问题标题】:Cannot relate new groupby dataframe to original dataframe无法将新的 groupby 数据框与原始数据框相关联
【发布时间】:2020-01-09 20:08:42
【问题描述】:

我有一个名为differ_vt 的数据框,我想应用groupby 并在'CO_FIPS''FLD_ZONE' 列上进行汇总:

        FLD_ZONE    AWPOP_1   Area_SQMI_1   AWHU_1  AWPOP_2  Area_SQMI_2    AWHU_2  CO_FIPS
    0   A           18.1      23.1          101.3   3.0      23.1           3.1     50001   
    1   AE          6.7       13.5          58.6    0.03     13.5           4.8     50001   
    2   N           1.3       1.2           23.0    7.1      1.2            8.3     50001
    3   X           0.0       38.5          0.0     0.0      38.5           0.0     50001
    4   X500        4.6       44.5          4.8     4.8      44.5           2.1     50001

我为分组和汇总的数据创建了一个新的数据框:

vt_sum = differ_vt_outer.groupby(['CO_FIPS', 'FLD_ZONE']).agg({'AWPOP_1': 'sum', 'Area_SQMI_1': 'sum', 'AWHU_1': 'sum', 'AWPOP_2': 'sum', 'Area_SQMI_2': 'sum', 'AWHU_2': 'sum'})

新的数据框如下所示:

vt_sum.head()
>
                  AWPOP_1   Area_SQMI_1 AWHU_1  AWPOP_2 Area_SQMI_2 AWHU_2 
CO_FIPS FLD_ZONE                        
50001   A         2335.8    79.7        1095.1  2334.0  79.7        1094.1
        AE        2134.5    74.1        1179.5  2134.5  74.1        1179.5
        N         96.8      0.2         13.1    94.0    0.2         11.7
        X         68119.7   1333.2      30623.9 68115.5 1333.2      30621.9
        X500      339.2     4.4         149.8   339.2   4.4         149.8
50003   A         1006.9    4.8         542.7   1006.9  4.8         542.7
        AE        2441.6    2.3         1265.0  2441.6  2.3         1265.0
        AO        3.1       0.0         3.5     3.1     0.0         3.5
        X         34896.6   700.4       20075.2 34896.6 700.4       20075.2

现在,我想将汇总数据框与原始 diff_vt 数据框相关联,并根据汇总值创建新列。例如,对于CO_FIPS = 50001FLD_ZONE = A,我想添加一个名为Tot_AWPOP_1 的列,其值为2335.8。

differ_vt_outer['Tot_AWPOP_1'] = vt_sum['AWPOP_1'].values

但是,当我运行它时,我得到了错误:

ValueError:值的长度与索引的长度不匹配

我该如何解决这个问题?

【问题讨论】:

    标签: python-3.x pandas dataframe pandas-groupby


    【解决方案1】:

    您可以在groupbyjoin 之后使用transform 而不是agg 将结果添加到原始数据框add_prefix 到列名之后,尝试:

    list_col_sum = ['AWPOP_1', 'Area_SQMI_1', 'AWHU_1', 'AWPOP_2', 'Area_SQMI_2', 'AWHU_2']
    differ_vt_outer = differ_vt_outer.join(differ_vt_outer.groupby(['CO_FIPS', 'FLD_ZONE'])[list_col_sum ]\
                                                          .transform(sum).add_prefix('Tot_'))
    

    【讨论】:

    • 你觉得这个小技巧怎么样? differ_vt_outer.assign(**differ_vt_outer.groupby(['CO_FIPS','FLD_ZONE']).agg('sum').add_prefix('Tot_').reset_index())
    • @ScottBoston 对于给定的示例,它似乎与实际使用 aggtransform 一样工作(实际上没有与输入有关的聚合),但如果你替换它似乎会失败之前的一些值,例如differ_vt_outer.loc[1,['FLD_ZONE', 'CO_FIPS']] = differ_vt_outer.loc[0,['FLD_ZONE', 'CO_FIPS']].values?或者您打算在没有reset_index 的情况下在您的方法中使用transform? ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 2019-04-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多