【问题标题】:How can you get rolling value count (frequency) with Pandas? (computationally efficient, no loops)如何使用 Pandas 获得滚动值计数(频率)? (计算效率高,无循环)
【发布时间】:2021-04-16 10:47:00
【问题描述】:

我有一个值列表,我想得到它们的滚动频率,所以是这样的:

df = pd.DataFrame({
    'val': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3]
})

result = df.val.rolling(3).freq()

result == pd.Series([1, 2, 3, 3, 3, 1, 2, 3, 3, 3, 1, 2, 3, 3, 3])

当然,我可以使用循环来执行此操作,但是对于大量数据,计算成本可能很高,因此我更愿意使用内置的或矢量化的东西等。但不幸的是,从我的搜索中,没有这似乎是一个解决方案。

提前致谢!

【问题讨论】:

  • 为什么会矛盾呢?还有第一个。
  • 窗口大小为 3 的滚动函数结果的前两个元素如何与您想要的输出中的 NaN 不同?
  • @Mr.T [1, 1, 2] 返回1 因为2 在窗口中只出现一次(假设T-2、T-1、T0)

标签: python pandas dataframe numpy time-series


【解决方案1】:

窗口大小为n 的滚动函数结果的第一个n-1 元素必须为每个定义NaN

result = df.val.rolling(3).apply(lambda x: np.count_nonzero(x==x.iloc[-1])).astype('Int64')

结果:

0     <NA>
1     <NA>
2        3
3        3
4        3
5        1
6        2
7        3
8        3
9        3
10       1
11       2
12       3
13       3
14       3

【讨论】:

  • 不完全是,我知道我把一个数字作为窗口,但我实际上会将它用于时间序列,如果你把一个窗口放在字符串表示中,那么它不会填充不完整的窗口NaNs -- 尽管如此,这是一个很好的解决方案,它比我的解决方案高了约 50%,所以谢谢!!
猜你喜欢
  • 2021-09-02
  • 2021-04-05
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 2020-07-07
  • 2015-05-07
相关资源
最近更新 更多