如何将DataFrame列中回溯n行的滚动值合并为单个单元格整数?
解决方案
要实现回溯n行拼接成整数的需求,你可以使用Pandas的rolling窗口结合自定义函数来高效处理,下面是具体实现:
示例代码
import pandas as pd # 构造测试数据 df = pd.DataFrame({'Streak': [1, 2, 3, 4, 5, 6, 7, 8, 9]}) n = 3 # 回溯窗口大小 # 生成拼接后的历史列 df['Streak History'] = df['Streak'].rolling(window=n).apply( lambda x: int(''.join(map(str, x))), raw=False ) # 前n-1行数据不足窗口大小,设置为NaN df.loc[:n-2, 'Streak History'] = pd.NA print(df)
运行后输出结果:
Streak Streak History 0 1 <NA> 1 2 <NA> 2 3 123 3 4 234 4 5 345 5 6 456 6 7 567 7 8 678 8 9 789
代码解释
rolling(window=n):创建一个大小为n的滑动窗口,每个窗口包含当前行及之前n-1行的数据apply自定义函数:对每个窗口内的元素依次转为字符串,拼接后再转为整数- 设置前n-1行为NaN:因为前n-1行没有足够的回溯数据,不符合窗口要求,直接设为缺失值
原代码问题分析
你之前的代码错误在于:
- 循环中直接将
shift(x)返回的整个Series转为字符串拼接,得到的是整个Series的文本表示(而非每行对应的值),导致最终结果既不是正确的拼接值,也无法匹配DataFrame的行长度 - 没有针对每行单独处理回溯逻辑,而是试图一次性拼接整个列,逻辑方向错误
如果数据量较小,也可以用循环遍历每行的方式实现:
def get_streak_history(df, n): result = [] for idx in range(len(df)): if idx < n - 1: result.append(pd.NA) else: # 提取当前行及前n-1行的数值 window_vals = df['Streak'].iloc[idx - n + 1: idx + 1].astype(str) result.append(int(''.join(window_vals))) return result df['Streak History'] = get_streak_history(df, 3)
内容的提问来源于stack exchange,提问作者Trav
相关产品推荐
相关产品推荐

