按Symbol分组统计当前Close到下一个更小Close值的行数
问题
现有股票数据如下:
Date, Symbol, Close
2021-01-01, AAPL, 10
2021-01-02, AAPL, 12
2021-01-03, AAPL, 3
2021-01-01, MSFT, 12
2021-01-02, MSFT, 20
2021-01-03, MSFT, 12
2021-01-04, MSFT, 1
2021-01-05, MSFT, 2
2021-01-06, MSFT, 3
需要按Symbol分组,统计每一行的Close值到下一个小于该值的Close值之间的行数,最终生成包含Output列的结果,期望输出如下:
Date, Symbol, Close, Output
2021-01-01, AAPL, 10, 2
2021-01-02, AAPL, 12,1
2021-01-03, AAPL, 3, NaN
2021-01-01, MSFT, 12, 3
2021-01-02, MSFT, 20, 1
2021-01-03, MSFT, 12, 1
2021-01-04, MSFT, 1, NaN
2021-01-05, MSFT, 2, 1
2021-01-06, MSFT, 1, NaN
解决方案(Python Pandas)
用Pandas可以通过分组遍历的方式实现需求,代码如下:
import pandas as pd # 构造原始数据(实际可替换为pd.read_csv读取文件) df = pd.DataFrame({ 'Date': ['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05', '2021-01-06'], 'Symbol': ['AAPL', 'AAPL', 'AAPL', 'MSFT', 'MSFT', 'MSFT', 'MSFT', 'MSFT', 'MSFT'], 'Close': [10, 12, 3, 12, 20, 12, 1, 2, 3] }) def get_days_to_drop(group): output = [] closes = group['Close'].values n = len(closes) for i in range(n): current = closes[i] # 从下一行开始找第一个更小的值 for j in range(i+1, n): if closes[j] < current: output.append(j - i) break else: # 没有找到则添加空值 output.append(pd.NA) group['Output'] = output return group # 按Symbol分组处理 result = df.groupby('Symbol', group_keys=False).apply(get_days_to_drop) # 输出结果 print(result.to_csv(index=False))
代码解释
- 先构造数据框(实际使用时可以直接读取CSV文件)。
- 定义处理函数
get_days_to_drop:对每个分组,遍历每一行的Close值,从下一行开始查找第一个小于当前值的位置,计算两行的索引差作为结果;如果遍历到末尾都没找到,就添加pd.NA。 - 按
Symbol分组后应用该函数,得到最终结果。
运行代码后输出的内容和期望完全一致。
内容的提问来源于stack exchange,提问作者greenguy
相关产品推荐
相关产品推荐

