【发布时间】:2019-06-21 13:54:49
【问题描述】:
我有一个包含 ID、日期和数值的数据框。我将每个 ID 的数据分组,然后计算前面行的累积量,时间窗口为 30 天。在下面的数据框中,这是使用下面的代码完成的(实际的数据框包含多个 ID 和多个日期)。
简而言之,SUM_AMOUNT 列是基于其他列创建的。
代码:
def get_rolling_amount(grp, freq, on_name, column_name):
return grp.rolling(freq, on=on_name, closed='left')[column_name].sum()
df[new_column_name] = df.groupby('ID', as_index=False, group_keys=False)\
.apply(get_rolling_amount, '30D', 'DATE', 'AMOUNT')
数据框:
ID DATE AMOUNT SUM_AMOUNT
111935 100000 2015-02-18 455.00 NaN
111936 100000 2015-02-18 455.00 455.00
111937 100000 2015-04-02 455.00 NaN
111938 100000 2015-04-02 925.00 455.00
111939 100000 2015-04-02 2780.00 1380.00
111940 100000 2015-04-09 895.00 4160.00
111941 100000 2015-04-09 425.00 5055.00
111942 100000 2015-04-09 425.00 5480.00
111943 100000 2015-04-09 925.00 5905.00
111944 100000 2015-04-09 455.00 6830.00
111947 100000 2015-05-21 1003.00 NaN
111945 100000 2015-05-26 455.00 1003.00
111946 100000 2015-05-26 925.00 1458.00
111948 100000 2015-05-26 455.00 2383.00
111949 100000 2015-05-26 2780.00 2838.00
111950 100000 2015-05-26 425.00 5618.00
111951 100000 2015-05-26 1000.00 6043.00
111952 100000 2015-05-26 455.00 7043.00
111953 100000 2015-05-26 455.00 7498.00
111954 100000 2015-06-19 925.00 7953.00
111955 100000 2015-06-19 1820.00 8878.00
111956 100000 2015-06-19 925.00 10698.00
如您所见,每个 ID 都有具有相同日期的行。我无法以更详细的形式获得日期。我不想在计算中考虑相同日期的值,因为如果它们在同一日期并且顺序很重要,我不知道它们的顺序是什么。
我真正想要的
我希望能够获得过去 30 天范围内的所有数据点的累积总和,不包括当前行的日期。 我已更改数据框以反映我想要的内容:
ID DATE AMOUNT SUM_AMOUNT
111935 100000 2015-02-18 455.00 NaN
111936 100000 2015-02-18 455.00 NaN
111937 100000 2015-04-02 455.00 NaN
111938 100000 2015-04-02 925.00 NaN
111939 100000 2015-04-02 2780.00 NaN
111940 100000 2015-04-09 895.00 4160.00
111941 100000 2015-04-09 425.00 4160.00
111942 100000 2015-04-09 425.00 4160.00
111943 100000 2015-04-09 925.00 4160.00
111944 100000 2015-04-09 455.00 4160.00
111947 100000 2015-05-21 1003.00 NaN
111945 100000 2015-05-26 455.00 1003.00
111946 100000 2015-05-26 925.00 1003.00
111948 100000 2015-05-26 455.00 1003.00
111949 100000 2015-05-26 2780.00 1003.00
111950 100000 2015-05-26 425.00 1003.00
111951 100000 2015-05-26 1000.00 1003.00
111952 100000 2015-05-26 455.00 1003.00
111953 100000 2015-05-26 455.00 1003.00
111954 100000 2015-06-19 925.00 7953.00
111955 100000 2015-06-19 1820.00 7953.00
111956 100000 2015-06-19 925.00 7953.00
因此,如果该行的日期为 2015-06-19,我希望在 30 天的窗口中获得所有先前行的总和,但日期为 2015-06-19 的行不应包含在该窗口中.
另一件重要的事情是我不能折叠行以使每个 ID 和 DATE 成为一行。
我该怎么做?
【问题讨论】:
-
您可以使用DataFrame.drop_duplicates。
... I cannot collapse the rows to make one row per ID and DATE.- 为什么?? -
IIUC,索引为 111938 和 111937 的行应该是
NaN,不是吗? -
@Ben.T 你是对的,解决了这个问题。
-
@wwii 为了以后的处理,我需要将每一行分开。