【问题标题】:calculating % difference across grouped pandas dataframe计算分组熊猫数据帧之间的百分比差异
【发布时间】:2022-11-29 00:21:14
【问题描述】:

我已经计算了数据框中分组 ID 的两个月值之间的差异,我现在刚开始计算差异百分比,但在我使用 .pct_change() 的所有尝试中都收到了键盘错误或“NaN”。

我的 datafrane 构造如下;

ID MONTH TOTAL Variance
REF1 1 55 0
REF1 2 65 10
REF1 3 66 1
REF2 7 65 -15
REF2 6 80 10
REF2 8 100 35

我现在需要添加另一列来描述上个月之间的差异百分比。

    df_all = ( 
            pd.concat(pd.read_excel("testdata.xlsx",
                                    header=None, sheet_name=None), ignore_index=True)
                .T.set_index(0).T
                .rename_axis(None, axis=1)
                .loc[:, ["ID", "DATE", "TOTAL"]]
                .assign(MONTH= lambda x: x["DATE"].dt.month)
                .groupby(by=["ID", "MONTH"], as_index=False).agg({"TOTAL":sum})
         )

df_all['Variance'] = df_all['TOTAL'].sub(
               df_all[['ID', 'MONTH']]
               .merge(df_all.assign(MONTH=df_all['MONTH'].add(1)),
                      how='left')['TOTAL']
              )
df_all['Variance'].fillna(0, inplace=True)

【问题讨论】:

  • 向我们展示您的代码
  • 添加了我创建数据框的代码

标签: pandas dataframe calculation


【解决方案1】:

pct_chaange 对给定的样本数据工作得很好:

df['%'] = df.sort_values(['ID','MONTH']).groupby(['ID'])['TOTAL'].pct_change() * 100

输出 :

     ID  MONTH  TOTAL  Variance          %
0  REF1      1     55         0        NaN
1  REF1      2     65        10  18.181818
2  REF1      3     66         1   1.538462
3  REF2      7     65       -15 -18.750000
4  REF2      6     80        10        NaN
5  REF2      8    100        35  53.846154

【讨论】:

  • 我需要代码来对 ID 和 MONTH 进行分组,所以我希望 REF2/6 的 NaN 因为数据框中没有上个月的数据?
  • @Ryan1234 然后按 id 分组,查看更新的答案
  • 谢谢,刚刚运行了这段代码,我看到了“ZeroDivisionError:被零除”
  • @Ryan1234 嗯...您在 total 列中有 0,这对于比较百分比变化没有意义
  • 我设法完成了这项工作,谢谢
猜你喜欢
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
相关资源
最近更新 更多