
1. 问题背景与挑战
在数据分析中,我们经常需要对某一列数据进行累积求和(cumulative sum)。然而,有时这种累积求和并非针对所有行,而是需要根据其他列的特定条件来触发、延续或中断。例如,在一个交易数据集中,我们可能希望在遇到“买入”或“卖出”信号时开始或延续对“价值”列的累积求和,而在没有这些信号时则不进行求和。
考虑以下数据示例:
| Date | Buy | Sell | Value | Cumulative Sum |
|---|---|---|---|---|
| 01/01/2023 | 1 | |||
| 01/02/2023 | 1 | 5 | 5 | |
| 01/03/23 | 1 | 6 | ||
| 01/04/23 | 1 | 7 | ||
| 01/05/23 | 1 | 1 | 8 | |
| 01/06/23 | 5 |
在这个例子中,“Cumulative Sum”列的计算逻辑是:
- 当“Buy”或“Sell”列出现“1”时,开始或延续累积求和。
- 一旦累积求和开始,它会持续到下一个“Buy”或“Sell”信号出现,或者直到数据结束。
- 没有“Buy”或“Sell”信号的行,如果之前也没有激活的信号,则“Cumulative Sum”为空。
直接使用 cumsum() 函数无法满足这种条件和状态变化的复杂逻辑。手动循环虽然可行,但在大型数据集中效率低下。因此,我们需要一种利用 Pandas 向量化操作的解决方案。
2. Pandas 解决方案详解
本解决方案将通过一系列 Pandas 操作,逐步构建出所需的条件累积和。
2.1 准备数据
首先,我们创建一个示例 DataFrame 来模拟上述场景:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'date': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06',
'2023-01-07', '2023-01-08', '2023-01-09', '2023-01-10', '2023-01-11', '2023-01-12'],
'buy': [np.nan, 1, np.nan, np.nan, np.nan, np.nan, np.nan, 1, np.nan, np.nan, np.nan, np.nan],
'sell': [np.nan, np.nan, np.nan, np.nan, 1, np.nan, np.nan, np.nan, np










