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

