根据每组的频率填充数据帧
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.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_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...以上是关于根据每组的频率填充数据帧的主要内容,如果未能解决你的问题,请参考以下文章