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

Posted

技术标签:

【中文标题】根据每组的频率填充数据帧【英文标题】:pad a data frame according to a frequency for each group 【发布时间】:2019-04-14 07:45:53 【问题描述】:

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

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

注意

    group_column 可以有数百个唯一值。 有些组可以“持续”几分钟,而其他组可以持续几天,边缘由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'))

【问题讨论】:

我认为您应该将 group_column 更改为索引的一部分 (df.set_index('group_column', inplace=True, drop=False)),然后尝试找出如何使重采样工作,或者(理想情况下)在整个 DataFrame 上,或者也许一次一组。见***.com/questions/15799162/… 【参考方案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

【讨论】:

【参考方案2】:

我的方法是

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               

【讨论】:

为什么这比 jezrael 的答案更好?更快? 我并不是想有更好的解决方案,它首先是我的。我没有计时,通常根据我在这里的经验,检查@jezrael 发布的任何内容通常是一个好主意,至少在熊猫方面是这样。但是,在这种情况下,他使用了apply,而我的方法没有,因此比较性能可能值得... 与此同时,我能够计时,@jezrael 的代码快了大约 25%。我一直认为“不申请更好”,但显然这是错误的。现在为什么最好问jezrael...

以上是关于根据每组的频率填充数据帧的主要内容,如果未能解决你的问题,请参考以下文章

给定数据框中项集的计数频率

Matlab:在一帧音频数据中查找主要频率

随机采样具有给定权重(频率)的数据帧行

NTP时间同步服务器(频率同步)包含帧同步载波同步位同步

在python中合并具有不同时间频率的系列/数据帧

将 collections.Counters 的组合频率从数据帧多索引转换为字符串