【问题标题】: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 中的每个值都需要如此,因此每分钟都可能有多个值。

注意

  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'))

【问题讨论】:

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

标签: python pandas


【解决方案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...
    猜你喜欢
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多