如何灵活实现Pandas DataFrame首行重复n次前置、末行重复后置?
灵活实现Pandas DataFrame首行重复n次(n为原长度)+ 末尾追加末行
嘿,你的需求很明确——就是要让代码能适配任意长度的DataFrame,不用硬编码重复次数对吧?这里有两个简洁又灵活的一行式方案,完全满足你的需求:
方案1:用pd.concat拼接(直观易懂)
这个方法通过拼接三个部分来实现:重复len(df)次的首行、原DataFrame、以及单独的末行,最后重置索引避免重复:
import pandas as pd import numpy as np # 你的原始DataFrame构造代码 probes = {'PT011': [-0.16,-0.162,-0.164,-0.166,-0.167], 'PT012': [-0.1,-0.12,-0.14,-0.16,-0.15], 'PT013': [-0.1,-0.12,-0.14,-0.16,-0.15], 'PT014': [-0.09,-0.10,-0.11,-0.11,-0.13], 'PT015': [-0.1,-0.12,-0.14,-0.16,-0.15], 'PT021': [-0.1,-0.12,-0.14,-0.16,-0.15], 'PT022': [-0.1,-0.12,-0.14,-0.16,-0.15], 'PT023': [-0.1,-0.12,-0.14,-0.16,-0.15], 'PT024': [-0.1,-0.12,-0.14,-0.16,-0.15], 'PT025': [-0.2,-0.12,-0.14,-0.16,-0.15] } df = pd.DataFrame(probes) # 核心一行代码 new_df = pd.concat([df.iloc[[0]].repeat(len(df)), df, df.iloc[[-1]]]).reset_index(drop=True) print("处理后的DataFrame:\n", new_df)
代码解释:
df.iloc[[0]].repeat(len(df)): 取出首行,重复次数等于原DataFrame的长度(动态获取,无需硬编码)df: 原DataFrame的所有行df.iloc[[-1]]: 取出末行reset_index(drop=True): 重置索引,避免出现重复的行索引
方案2:用np.r_构造索引(更高效)
如果你追求更高的性能,尤其是处理大型DataFrame时,可以用numpy构造索引数组,直接提取所需行:
# 核心一行代码 new_df = df.iloc[np.r_[np.repeat(0, len(df)), np.arange(len(df)), len(df)-1]].reset_index(drop=True)
代码解释:
np.repeat(0, len(df)): 生成包含len(df)个0的数组(对应首行的索引)np.arange(len(df)): 生成原DataFrame所有行的索引(0到len(df)-1)len(df)-1: 末行的索引np.r_[]: 把这三部分索引拼接成一个数组,用iloc提取对应行,最后重置索引
如果你想要的是「首行重复n次 + 原DataFrame除首行 + 末行」
看你原来的代码只保留了原DataFrame的第1到最后一行,如果你实际需求是这样的话,只需要稍微修改方案:
# 方案1修改版 new_df = pd.concat([df.iloc[[0]].repeat(len(df)), df.iloc[1:], df.iloc[[-1]]]).reset_index(drop=True) # 方案2修改版 new_df = df.iloc[np.r_[np.repeat(0, len(df)), np.arange(1, len(df)), len(df)-1]].reset_index(drop=True)
这两个方案都完全不需要硬编码任何数字,不管你的DataFrame是5行还是500行,都能自动适配~
内容的提问来源于stack exchange,提问作者Tomasz




