根据每组的频率填充数据帧

我有一个pandas.DataFrame df带 apandas.DatetimeIndex和一个名为group_column. 我需要df有一个每分钟的频率(意味着每分钟有一排)。

但是,对于 中的每个值都需要如此group_column,因此每一分钟都可能有多个值。

注意

  1. group_column可以有上百个独特的价值。

  2. 某些组可以“持续”几分钟,而其他组可以持续数天,边缘由 中值的第一次和最后一次出现决定group_column


例子

输入:

dates = [pd.Timestamp('2018-01-01 12:00'), pd.Timestamp('2018-01-01 12:01'), pd.Timestamp('2018-01-01 12:01'), pd.Timestamp('2018-01-01 12:03'), pd.Timestamp('2018-01-01 12:04')]

df = pd.DataFrame({'group_column': ['a', 'a','b','a','b'], 'data_column': [1.2, 2.2, 4, 1, 2]}, index=dates)


                    group_column        data_column

2018-01-01 12:00:00      a                  1.2

2018-01-01 12:01:00      a                  2.2

2018-01-01 12:01:00      b                  4.0

2018-01-01 12:03:00      a                  1.0

2018-01-01 12:04:00      b                  2.0

所需的输出:


                    group_column    data_column

2018-01-01 12:00:00      a              1.2

2018-01-01 12:01:00      a              2.2

2018-01-01 12:02:00      a              2.2

2018-01-01 12:03:00      a              1.0

2018-01-01 12:01:00      b              4.0

2018-01-01 12:02:00      b              4.0

2018-01-01 12:03:00      b              4.0

2018-01-01 12:04:00      b              2.0

我的尝试


我已经这样做了,但它似乎非常低效的:


def group_resmaple(df, group_column_name):

    values = df[group_column_name].unique()

    for value in values:

        df_g = df.loc[df[group_column]==value]

        df_g = df_g.asfreq('min', 'pad')

        yield df_g


df_paded = pd.concat(group_resmaple(df, 'group_column'))


ABOUTYOU
浏览 154回答 2
2回答

炎炎设计

使用GroupBy.apply有asfreq:df1 = (df.groupby('group_column')         .apply(lambda x: x.asfreq('min', 'pad'))         .reset_index(level=0, drop=True))print (df1)                    group_column  data_column2018-01-01 12:00:00            a          1.22018-01-01 12:01:00            a          2.22018-01-01 12:02:00            a          2.22018-01-01 12:03:00            a          1.02018-01-01 12:01:00            b          4.02018-01-01 12:02:00            b          4.02018-01-01 12:03:00            b          4.02018-01-01 12:04:00            b          2.0

至尊宝的传说

我的方法是df2 = df.groupby('group_column').resample('min').ffill().reset_index(level=0, drop=True)print(df2)                     data_column group_column2018-01-01 12:00:00          1.2            a               2018-01-01 12:01:00          2.2            a               2018-01-01 12:02:00          2.2            a               2018-01-01 12:03:00          1.0            a               2018-01-01 12:01:00          4.0            b               2018-01-01 12:02:00          4.0            b               2018-01-01 12:03:00          4.0            b               2018-01-01 12:04:00          2.0            b  
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python