如何编写Python函数实现Pandas DataFrame指定val列值的单行复制
函数实现方案
你不需要对全量索引做重复操作,有两种简洁的实现方式可选:
方案1:拼接法(默认把复制行放末尾)
直接筛选出目标行后和原DataFrame拼接即可,逻辑最直观:
import pandas as pd def dupRow(df, val): # 筛选val列等于目标值的所有行 target_rows = df[df['val'] == val] # 拼接原数据与目标行,重置索引保证序号连续 return pd.concat([df, target_rows], ignore_index=True)
方案2:np.repeat 定向重复(复制行自动跟在原行后面)
如果你想用np.repeat相关的逻辑实现,可以给不同行指定不同的重复次数,仅对目标行设置重复2次,其余行保留1次即可:
def dupRow(df, val): # 匹配到的行重复2次,其余行重复1次 repeat_counts = df['val'].eq(val).map({True: 2, False: 1}) # 按重复规则生成新数据集,重置索引 return df.loc[df.index.repeat(repeat_counts)].reset_index(drop=True)
效果验证
用你提供的示例数据测试:
# 构造输入DataFrame df = pd.DataFrame({ 'val': ['a', 'b', 'c', 'd'], 'data1': [3, 89, 7, 0], 'data2': [1, 2, 3, 4], 'data3': [9, 8, 7, 6] }) # 调用函数 print(dupRow(df, 'c'))
输出结果和你要求的完全一致:
val data1 data2 data3 0 a 3 1 9 1 b 89 2 8 2 c 7 3 7 3 c 7 3 7 4 d 0 4 6
可选调整
- 如果val列存在多个匹配行,你只需要复制第一个匹配行,筛选时增加
.head(1)即可:target_rows = df[df['val'] == val].head(1) - 如果有特殊的顺序要求,你可以拿到返回结果后自行调整行顺序。
内容的提问来源于stack exchange,提问作者Brian Postow
相关产品推荐
相关产品推荐

