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

时间:2018-11-11 10:19:11

标签: python pandas

我有一个pandas.DataFrame和一个df列的pandas.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'))

2 个答案:

答案 0 :(得分:1)

GroupBy.applyasfreq一起使用:

df1 = (df.groupby('group_column')
         .apply(lambda x: x.asfreq('min', 'pad'))
         .reset_index(level=0, drop=True))
print (df1)
                    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

答案 1 :(得分:1)

我的方法是

df2 = df.groupby('group_column').resample('min').ffill().reset_index(level=0, drop=True)
print(df2)

                     data_column group_column
2018-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