首页 > 解决方案 > python和数据框:按周分组并计算总和和差异

问题描述

我有一个包含以下列的数据框:

      DATE      ALFA    BETA
2016-04-26         1       3
2016-04-27         3       0
2016-04-28         0       8
2016-04-29         4       2
2016-04-30         3       1
2016-05-01        -2      -5
2016-05-02         3       0
2016-05-03         3       3
2016-05-08         1       7
2016-05-11         3       1
2016-05-12        10       1
2016-05-13         4       2

我想将数据分组在每周范围内,但对 alpha 和 beta 列进行不同的处理。我想计算ALFA每周列中数字的总和,而对于BETA列,我想计算一周开始和结束之间的差异。我向您展示了预期结果的示例。

      DATE      sum_ALFA    diff_BETA
2016-04-26            12            3
2016-05-03             4            4
2016-05-11            17            1

我试过这段代码,但它计算每列的总和

df = df.resample('W', on='DATE').sum().reset_index().sort_values(by='DATE')

这是我的数据集https://drive.google.com/uc?export=download&id=1fEqjINx9R5io7t_YxA9qShvNDxWRCUke

标签: pythonpandasdataframe

解决方案


我想我在这里有不同的语言环境(因此我的一周不同),你可以这样做:

df.resample("W", on="DATE",closed="left", label="left"
            ).agg({"ALFA":"sum", "BETA": lambda g: g.iloc[0] - g.iloc[-1]})
            ALFA  BETA
DATE
2016-04-24    11     2
2016-05-01     4    -8
2016-05-08    18     5

我认为我的方法可以解决您的数据问题。定义

def get_series_first_minus_last(s):
    try:
        return s.iloc[0] - s.iloc[-1]
    except IndexError:
        return 0

并仅通过函数调用替换 lambda 调用,即

df.resample("W", on="DATE",closed="left", label="left"
            ).agg({"ALFA":"sum", "BETA": get_series_first_minus_last})

请注意,在新定义的函数中,如果您愿意,也可以返回 nan。


推荐阅读