使用pandas.DataFrame.resample我可以对DataFrame进行缩减采样:
df.resample("3s", how="mean")
这会重新采样具有类似日期时间的索引的数据框,以便将3秒内的所有值聚合到一行中。列的值是平均值。
问题:我有一个包含多列的数据框。是否可以为不同的列指定不同的聚合函数,例如我想"sum"
列x
,"mean"
列y
并选择"last"
列z
?我怎样才能达到这个效果?
我知道我可以创建一个新的空数据框,然后调用resample
三次,但我更喜欢更快的就地解决方案。
答案 0 :(得分:13)
重新取样后,您可以使用.agg
。使用字典,您可以使用各种函数聚合不同的列。
试试这个:
df.resample("3s").agg({'x':'sum','y':'mean','z':'last'})
此外,不推荐使用how
:
C:\ Program Files \ Anaconda3 \ lib \ site-packages \ ipykernel__main __。py:1: FutureWarning:新语法如何弃用.resample() .resample(...)。平均()
答案 1 :(得分:5)
考虑数据框df
np.random.seed([3,1415])
tidx = pd.date_range('2017-01-01', periods=18, freq='S')
df = pd.DataFrame(np.random.rand(len(tidx), 3), tidx, list('XYZ'))
print(df)
X Y Z
2017-01-01 00:00:00 0.444939 0.407554 0.460148
2017-01-01 00:00:01 0.465239 0.462691 0.016545
2017-01-01 00:00:02 0.850445 0.817744 0.777962
2017-01-01 00:00:03 0.757983 0.934829 0.831104
2017-01-01 00:00:04 0.879891 0.926879 0.721535
2017-01-01 00:00:05 0.117642 0.145906 0.199844
2017-01-01 00:00:06 0.437564 0.100702 0.278735
2017-01-01 00:00:07 0.609862 0.085823 0.836997
2017-01-01 00:00:08 0.739635 0.866059 0.691271
2017-01-01 00:00:09 0.377185 0.225146 0.435280
2017-01-01 00:00:10 0.700900 0.700946 0.796487
2017-01-01 00:00:11 0.018688 0.700566 0.900749
2017-01-01 00:00:12 0.764869 0.253200 0.548054
2017-01-01 00:00:13 0.778883 0.651676 0.136097
2017-01-01 00:00:14 0.544838 0.035073 0.275079
2017-01-01 00:00:15 0.706685 0.713614 0.776050
2017-01-01 00:00:16 0.542329 0.836541 0.538186
2017-01-01 00:00:17 0.185523 0.652151 0.746060
使用agg
df.resample('3S').agg(dict(X='sum', Y='mean', Z='last'))
X Y Z
2017-01-01 00:00:00 1.760624 0.562663 0.777962
2017-01-01 00:00:03 1.755516 0.669204 0.199844
2017-01-01 00:00:06 1.787061 0.350861 0.691271
2017-01-01 00:00:09 1.096773 0.542220 0.900749
2017-01-01 00:00:12 2.088590 0.313316 0.275079
2017-01-01 00:00:15 1.434538 0.734102 0.746060