如何在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
相关产品推荐
相关产品推荐

