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

如何合并pandas DataFrame中filename重复行并扩展新列存储坐标值

pandas 重复filename行坐标列合并解决方案

核心思路

按filename列分组处理,每组内按行序号重命名坐标列后缀,合并后每个filename仅保留一行,无需手动遍历比对上下行,支持单filename对应任意数量的重复行。

完整可运行代码

首先是示例数据构造(你可以替换为自己的pd.read_xxx读取代码):

import pandas as pd

# 示例数据
data = {
    'filename': ['X', 'X', 'Y'],
    'width': [100, 100, 200],
    'height': [200, 200, 300],
    'class': [0, 1, 0],
    'xmin0': [10, 20, 15],
    'ymin0': [20, 30, 25],
    'xmax0': [50, 60, 55],
    'ymax0': [60, 70, 65]
}
df = pd.DataFrame(data)

核心处理逻辑:

# 配置项:固定保留列、坐标列、缺失值填充内容
fixed_cols = ['filename', 'width', 'height', 'class']
coord_cols = ['xmin0', 'ymin0', 'xmax0', 'ymax0']
fill_value = 'X'

result_buffer = []
# 按filename分组,保留原始顺序
for file_name, group_df in df.groupby('filename', sort=False):
    # 取当前filename的基础属性(第一行的固定列)
    row_data = group_df[fixed_cols].iloc[0].to_dict()
    # 遍历分组内所有行,重命名坐标列
    for seq, (_, row) in enumerate(group_df.iterrows()):
        # 把坐标列的0后缀替换为当前序号
        renamed_coords = {col.replace('0', str(seq)): row[col] for col in coord_cols}
        row_data.update(renamed_coords)
    result_buffer.append(row_data)

# 转换为DataFrame,填充缺失值
result_df = pd.DataFrame(result_buffer).fillna(fill_value)

注:如果同一个filename的width、height、class属性需要取最后一行的值,把group_df[fixed_cols].iloc[0]改为group_df[fixed_cols].iloc[-1]即可。

适配df.insert的补充说明

如果需要严格用df.insert实现列插入,可在生成result_buffer后,按列顺序调用insert方法插入即可,上述逻辑已经完成了坐标列的重命名和数值匹配,不需要调整核心逻辑。

内容的提问来源于stack exchange,提问作者ali.salmasiii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:06:04