You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何灵活实现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

火山引擎 最新活动