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

如何在Pandas中通过滚动窗口将n行内容拼接至当前行?

如何在Pandas中通过滚动窗口将n行内容拼接至当前行?

你好呀!你的需求完全可以用Pandas的内置函数来实现,不用手动写循环~ 我们可以结合shift()或者rolling()来更简洁地完成这个操作,下面给你两种高效的实现思路:

方法一:利用shift()获取前一行并拼接

这种方法通过shift()快速拿到前一行的内容,再和当前行拼接,逻辑直观且效率较高:

import pandas as pd
import numpy as np

# 构建原始DataFrame
df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]))

# 先把DataFrame的每一行转成列表格式
row_lists = df.apply(list, axis=1)

# 获取前一行的列表,第一行用空列表填充
prev_row_lists = row_lists.shift(1).fillna(pd.Series([[]])).explode().groupby(level=0).agg(list)

# 生成新列:前一行列表 + 当前行列表的拼接结果
new_col = row_lists.combine(prev_row_lists, lambda x, y: y + x)
# 手动将第一行的新列设为空列表
new_col.iloc[0] = []

# 组合原行列表与新列内容,得到最终结果
result = row_lists.combine(new_col, lambda x, y: x + [y]).tolist()

print(result)

代码说明:

  • row_lists将每一行转成列表,方便后续的列表拼接操作
  • shift(1)会把行整体下移一位,第一行变为NaN,我们用fillna把它替换成空列表
  • combine方法用来将当前行和前一行的列表拼接,最后把原行与新列组合成你需要的嵌套列表格式

方法二:利用rolling()滚动窗口实现

既然你提到了滚动窗口,我们可以直接用Pandas的rolling()功能,针对大小为2的窗口(当前行+前一行)进行处理:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]))

# 把每一行转成列表
row_lists = df.apply(list, axis=1)

# 用大小为2的滚动窗口,拼接窗口内的两行列表
rolling_combined = row_lists.rolling(2).apply(lambda win: win.iloc[0] + win.iloc[1], raw=False)
# 第一行没有前一行,手动设为空列表
rolling_combined.iloc[0] = []

# 组合原行与新列内容
result = row_lists.combine(rolling_combined, lambda x, y: x + [y]).tolist()

print(result)

代码说明:

  • rolling(2)创建一个包含当前行和前一行的滚动窗口,从第二行开始生效
  • apply内部对每个窗口的两行列表进行拼接,第一行因窗口不完整,我们手动替换为空列表
  • 最后同样通过combine组合原行与新列,得到目标格式的结果

补充说明

你的原始循环方法是完全可行的,但上面两种方法更贴合Pandas的向量化操作理念,当DataFrame行数较多时,效率会比手动循环更高。Pandas的rolling()确实支持这类滚动窗口计算,只是需要结合apply来实现自定义的列表拼接逻辑~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:18:10