合并DataFrame并重置ID列:问题排查与修正方案
Pandas合并DataFrame后重置ID列的解决方案
现有数据
有两个结构一致的DataFrame:
ID Name Time 0 0 A 100 1 1 B 70
ID Name Time 0 0 C 40 1 1 D 90
期望结果
合并后重置ID列,使ID从0开始连续递增,得到:
ID Name Time 0 0 A 100 1 1 B 70 2 2 C 40 3 3 D 90
现有代码及问题
编写的代码如下:
big_df = pd.DataFrame() for i in range(1,3): fname = 'test_' + str(i) + '.csv' small_df = pd.read_csv(fname, skiprows=[1]) print(small_df) frames = [big_df, small_df] big_df = pd.concat(frames) i += 1 big_df.set_index('ID', inplace=True) print(big_df)
运行后输出为:
Name Time ID 0 A 100 1 B 70 0 C 40 1 D 90
当前问题是ID列重复且未实现连续递增,同时set_index将ID列转为了索引,不符合预期需求。
修正方案
以下几种方式均可实现需求:
方法一:合并后重置索引并赋值给ID列
直接去掉set_index操作,改用重置默认索引的方式生成连续ID:
big_df = pd.DataFrame() for i in range(1,3): fname = 'test_' + str(i) + '.csv' small_df = pd.read_csv(fname, skiprows=[1]) frames = [big_df, small_df] big_df = pd.concat(frames) # 重置为从0开始的连续默认索引 big_df = big_df.reset_index(drop=True) # 将新索引值赋值给ID列 big_df['ID'] = big_df.index # 调整列顺序(可选,匹配期望结果的列顺序) big_df = big_df[['ID', 'Name', 'Time']] print(big_df)
方法二:结合你发现的索引转列方法修正
如果已经执行了set_index操作,可以通过以下步骤修正:
# 先重置默认连续索引,丢弃原ID索引 big_df = big_df.reset_index(drop=True) # 将新索引赋值给ID列 big_df['ID'] = big_df.index # 调整列顺序(可选) big_df = big_df[['ID', 'Name', 'Time']]
方法三:合并时直接忽略原索引
在concat阶段使用ignore_index=True参数,自动生成连续索引,再赋值给ID列,代码更简洁:
big_df = pd.DataFrame() for i in range(1,3): fname = 'test_' + str(i) + '.csv' small_df = pd.read_csv(fname, skiprows=[1]) # 合并时直接生成连续索引 big_df = pd.concat([big_df, small_df], ignore_index=True) # 将连续索引赋值给ID列 big_df['ID'] = big_df.index # 调整列顺序(可选) big_df = big_df[['ID', 'Name', 'Time']] print(big_df)
内容的提问来源于stack exchange,提问作者mahmood
相关产品推荐
相关产品推荐

