使用“bin size”/“frequency”重新采样 Pandas Dataframe
Posted
技术标签:
【中文标题】使用“bin size”/“frequency”重新采样 Pandas Dataframe【英文标题】:Resample Pandas Dataframe with "bin size"/"frequency" 【发布时间】:2013-12-06 17:09:42 【问题描述】:9我有一个多索引数据框,我想对其重新采样以将数据点的频率降低 3 倍(意味着每 3 行变为 1 行)。
这个:
time value
ID measurement
ET001 0 0 2
1 0.15 3
2 0.3 4
3 0.45 3
4 0.6 3
5 0.75 2
6 0.9 3
ET002 0 0 2
1 0.16 5
2 0.32 4
3 0.45 3
4 0.6 3
5 0.75 2
我想变成这样:
time value
ID measurement
ET001 0 0.15 3
1 0.6 2.7
2 0.9 3
ET002 0 0.16 3.7
1 0.6 2.7
我试图像这样将我的时间列变成熊猫日期时间索引,然后使用重新采样:
df = df.set_index(pd.DatetimeIndex(timecourse_normed['Time']))
df = df.groupby(level=0).resample(rule='0.1S', how=np.mean)
但是第一行给了我实际的日期(1970 年左右),这对第二行毫无帮助。浏览 arund 堆栈溢出时,我发现了一些类似的 quiestios,它们都有不基于 panda 的重采样的解决方案 - 而且,遗憾的是,这对我的用例不可行。
你能帮帮我吗?
【问题讨论】:
这里的诀窍是把你的问题分开,你真的有两个问题:1970 年的小整数(因为那是纪元时间的开始),以及关于重新采样的一些东西(它不起作用是没有给第一个问题的惊喜)。 我不一定想通过日期时间转换来做到这一点,我只是提到了我尝试过的方法。 - 那我应该删除它吗? 我不明白你是如何得到你想要的结果的数字(第一个 4.5 是什么)。 抱歉,我将总和除以 2 而不是 3。现在数字应该是正确的。 【参考方案1】:我认为你的想法可能是 - 将每个 ID
中的记录分成 3 条记录(如 SQL 中的 ntile(3))并按其分组并计算平均值。要创建这个数字,我们可以使用您已经为每一行拥有序列号的事实 - measurement
索引级别。所以我们可以把这个数字除以3
得到我们需要的数字:
>>> df
time value ntile
ID measurement
ET001 0 0.00 2 0
1 0.15 3 0
2 0.30 4 0
3 0.45 3 1
4 0.60 3 1
5 0.75 2 1
6 0.90 3 2
ET002 0 0.00 2 0
1 0.16 5 0
2 0.32 4 0
3 0.45 3 1
4 0.60 3 1
5 0.75 2 1
因此我们可以使用这样的辅助函数并将其应用于每个组以获得所需的结果。
>>> def helper(x):
... x = x.reset_index()
... x = x.groupby(x['measurement'].div(3)).mean()
... del x['measurement']
... return x
...
>>> df.groupby(level=0).apply(helper)
time value
ID measurement
ET001 0 0.15 3.000000
1 0.60 2.666667
2 0.90 3.000000
ET002 0 0.16 3.666667
1 0.60 2.666667
希望对你有帮助。
【讨论】:
以上是关于使用“bin size”/“frequency”重新采样 Pandas Dataframe的主要内容,如果未能解决你的问题,请参考以下文章
当使用$ project,$ frequency和$ group时,Mongoose按日期排序
gperftools 不精确与 CPUPROFILE_FREQUENCY
Relative-Frequency|frequency|pie chart |bar chart
词频-逆向文件频率TF-IDF(term frequency–inverse document frequency)是什么?有什么用处?