python - 更多 Pythonic/Pandaic 方法循环遍历 pandas 系列

标签 python loops pandas numpy

这很可能是非常基本的东西,但我无法弄清楚。 假设我有一个这样的系列:

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

如何在不恢复使用 for 循环的情况下对该系列的子系列进行操作?

例如,假设我想将它变成一个包含四个元素的新系列。这个新系列中的第一个元素是原始系列中前三个元素 (1, 1, 1) 的总和,第二个元素是后三个元素 (2, 2, 2) 的总和,依此类推:

s2 = pd.Series([3, 6, 9, 12])

我该怎么做?

最佳答案

你也可以使用 np.add.reduceat通过指定每第 3 个元素要减少的切片并计算它们的运行总和:

>>> pd.Series(np.add.reduceat(s1.values, np.arange(0, s1.shape[0], 3)))
0     3
1     6
2     9
3    12
dtype: int64

时序约束:

arr = np.repeat(np.arange(10**5), 3)
s = pd.Series(arr)
s.shape
(300000,)

# @IanS soln
%timeit s.rolling(3).sum()[2::3]        
100 loops, best of 3: 15.6 ms per loop

# @Divakar soln
%timeit pd.Series(np.bincount(np.arange(s.size)//3, s))  
100 loops, best of 3: 5.44 ms per loop

# @Nikolas Rieble soln
%timeit pd.Series(np.sum(np.array(s).reshape(len(s)/3,3), axis = 1))  
100 loops, best of 3: 2.17 ms per loop

# @Nikolas Rieble modified soln
%timeit pd.Series(np.sum(np.array(s).reshape(-1, 3), axis=1))  
100 loops, best of 3: 2.15 ms per loop

# @Divakar modified soln
%timeit pd.Series(s.values.reshape(-1,3).sum(1))
1000 loops, best of 3: 1.62 ms per loop

# Proposed solution in post
%timeit pd.Series(np.add.reduceat(s.values, np.arange(0, s.shape[0], 3)))
1000 loops, best of 3: 1.45 ms per loop

关于python - 更多 Pythonic/Pandaic 方法循环遍历 pandas 系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41485471/

相关文章:

python - 使用 2D 掩码和整个矩阵运算索引的 3D 或 4D Numpy 数组

python - 如何根据 Pandas 中字符串的出现有效地分配列值?

javascript - JSON 数据转换为数据集

python - 取 nlargest 5 并对 pandas 中的其余部分求和/计数

python - 查找一个系列在另一个系列中的匹配项,并使用正则表达式匹配打印整行数据帧

python - 使用多个条件删除 pandas 中的重复行

python - 如何用 Pandas 进行条件采样?

python - 使用 BS4 和 python 从 HTML 文件目录中抓取网页

c++ - 从另一个线程打破循环

javascript - 为什么我的 for 循环在一次迭代后停止?