You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

代码解释

  1. rolling(window=n):创建一个大小为n的滑动窗口,每个窗口包含当前行及之前n-1行的数据
  2. apply自定义函数:对每个窗口内的元素依次转为字符串,拼接后再转为整数
  3. 设置前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 02:14:54