【问题标题】:Repeat value with closer neighbor different from zero until value change与不为零的更近的邻居重复值,直到值改变
【发布时间】:2021-08-20 03:23:06
【问题描述】:

我有一个数据框,里面有大约 3000 万条记录,按 ID 分类并按日期打开。

我需要在先前日期的数量中分配一列最近行的值,我已经尝试使用 windows 参数使用滚动功能,但不幸的是我必须分配的数量是可变的(我的意思是,可以是 12, 6, 7, ...),并且这个参数不接受来自同一个 df 的变量。

工作正常,但 12 数字可以是可变的:

indexer = pd.api.indexers.FixedForwardWindowIndexer(window_size=12)
df['REPEAT_AMOUNT'] = df['AMOUNT'].rolling(window, min_periods=1).sum()

我尝试使用 df 中的变量来更改 window_size 的数量:

df['REPEAT_AMOUNT'] = df['AMOUNT'].rolling(window=df['VARIABLE_DISTRIBUTION'].astype(int), min_periods=1).sum()

但我收到以下错误:

ValueError: window must be an integer

除此之外,第一个记录的月份差异可能与后续记录的日期数字不同。

这是我目前拥有的:

+----+-----------------------+------------+---------+
| ID | VARIABLE_DISTRIBUTION |    DATE    |  AMOUNT |
+----+-----------------------+------------+---------+
|  1 |                    12 | 30-04-2021 |       - |
|  1 |                    12 | 31-05-2021 |       - |
|  1 |                    12 | 30-06-2021 |       - |
|  1 |                    12 | 31-07-2021 |     100 |
|  1 |                    12 | 31-08-2021 |       - |
|  1 |                    12 | 30-09-2021 |       - |
|  1 |                    12 | 31-10-2021 |       - |
|  1 |                    12 | 30-11-2021 |       - |
|  1 |                    12 | 31-12-2021 |       - |
|  1 |                    12 | 31-01-2022 |       - |
|  1 |                    12 | 28-02-2022 |       - |
|  1 |                    12 | 31-03-2022 |       - |
|  1 |                    12 | 30-04-2022 |       - |
|  1 |                    12 | 31-05-2022 |       - |
|  1 |                    12 | 30-06-2022 |       - |
|  1 |                    12 | 31-07-2022 |     150 |
|  2 |                     8 | 30-04-2021 |       - |
|  2 |                     8 | 31-05-2021 |     200 |
|  2 |                     8 | 30-06-2021 |       - |
|  2 |                     8 | 31-07-2021 |       - |
|  2 |                     8 | 31-08-2021 |       - |
|  2 |                     8 | 30-09-2021 |       - |
|  2 |                     8 | 31-10-2021 |       - |
|  2 |                     8 | 30-11-2021 |       - |
|  2 |                     8 | 31-12-2021 |       - |
|  2 |                     8 | 31-01-2022 |     300 |
|  2 |                     8 | 28-02-2022 |       - |
|  2 |                     8 | 31-03-2022 |       - |
|  2 |                     8 | 30-04-2022 |       - |
|  2 |                     8 | 31-05-2022 |       - |
|  2 |                     8 | 30-06-2022 |       - |
|  2 |                     8 | 31-07-2022 |       - |
+----+-----------------------+------------+---------+

这就是我想要的:

+----+-----------------------+------------+----------+----------------+
| ID | VARIABLE_DISTRIBUTION |    DATE    |  AMOUNT  |  REPEAT_AMOUNT |
+----+-----------------------+------------+----------+----------------+
|  1 |                    12 | 30-04-2021 |       -  |            100 |
|  1 |                    12 | 31-05-2021 |       -  |            100 |
|  1 |                    12 | 30-06-2021 |       -  |            100 |
|  1 |                    12 | 31-07-2021 |     100  |            100 |
|  1 |                    12 | 31-08-2021 |       -  |            150 |
|  1 |                    12 | 30-09-2021 |       -  |            150 |
|  1 |                    12 | 31-10-2021 |       -  |            150 |
|  1 |                    12 | 30-11-2021 |       -  |            150 |
|  1 |                    12 | 31-12-2021 |       -  |            150 |
|  1 |                    12 | 31-01-2022 |       -  |            150 |
|  1 |                    12 | 28-02-2022 |       -  |            150 |
|  1 |                    12 | 31-03-2022 |       -  |            150 |
|  1 |                    12 | 30-04-2022 |       -  |            150 |
|  1 |                    12 | 31-05-2022 |       -  |            150 |
|  1 |                    12 | 30-06-2022 |       -  |            150 |
|  1 |                    12 | 31-07-2022 |     150  |            150 |
|  2 |                     8 | 30-04-2021 |       -  |            200 |
|  2 |                     8 | 31-05-2021 |     200  |            200 |
|  2 |                     8 | 30-06-2021 |       -  |            300 |
|  2 |                     8 | 31-07-2021 |       -  |            300 |
|  2 |                     8 | 31-08-2021 |       -  |            300 |
|  2 |                     8 | 30-09-2021 |       -  |            300 |
|  2 |                     8 | 31-10-2021 |       -  |            300 |
|  2 |                     8 | 30-11-2021 |       -  |            300 |
|  2 |                     8 | 31-12-2021 |       -  |            300 |
|  2 |                     8 | 31-01-2022 |     300  |            300 |
|  2 |                     8 | 28-02-2022 |       -  |              - |
|  2 |                     8 | 31-03-2022 |       -  |              - |
|  2 |                     8 | 30-04-2022 |       -  |              - |
|  2 |                     8 | 31-05-2022 |       -  |              - |
|  2 |                     8 | 30-06-2022 |       -  |              - |
|  2 |                     8 | 31-07-2022 |       -  |              - |
+----+-----------------------+------------+----------+----------------+

感谢有关窗口参数或任何其他类型解决方案的任何帮助。

对不起,非英语母语

非常感谢。

【问题讨论】:

    标签: python pandas time-series rolling-computation


    【解决方案1】:

    IIUC 使用groupby bfill:

    df['REPEAT_AMOUNT'] = df.groupby('ID')['AMOUNT'].bfill()
    

    df:

        ID  VARIABLE_DISTRIBUTION        DATE AMOUNT REPEAT_AMOUNT
    0    1                     12  30-04-2021    NaN           100
    1    1                     12  31-05-2021    NaN           100
    2    1                     12  30-06-2021    NaN           100
    3    1                     12  31-07-2021    100           100
    4    1                     12  31-08-2021    NaN           150
    5    1                     12  30-09-2021    NaN           150
    6    1                     12  31-10-2021    NaN           150
    7    1                     12  30-11-2021    NaN           150
    8    1                     12  31-12-2021    NaN           150
    9    1                     12  31-01-2022    NaN           150
    10   1                     12  28-02-2022    NaN           150
    11   1                     12  31-03-2022    NaN           150
    12   1                     12  30-04-2022    NaN           150
    13   1                     12  31-05-2022    NaN           150
    14   1                     12  30-06-2022    NaN           150
    15   1                     12  31-07-2022    150           150
    16   2                      8  30-04-2021    NaN           200
    17   2                      8  31-05-2021    200           200
    18   2                      8  30-06-2021    NaN           300
    19   2                      8  31-07-2021    NaN           300
    20   2                      8  31-08-2021    NaN           300
    21   2                      8  30-09-2021    NaN           300
    22   2                      8  31-10-2021    NaN           300
    23   2                      8  30-11-2021    NaN           300
    24   2                      8  31-12-2021    NaN           300
    25   2                      8  31-01-2022    300           300
    26   2                      8  28-02-2022    NaN           NaN
    27   2                      8  31-03-2022    NaN           NaN
    28   2                      8  30-04-2022    NaN           NaN
    29   2                      8  31-05-2022    NaN           NaN
    30   2                      8  30-06-2022    NaN           NaN
    31   2                      8  31-07-2022    NaN           NaN
    

    【讨论】:

      猜你喜欢
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多