如何避免Pandas DataFrame合并时出现不必要的多重索引重复项?
解决Pandas多重索引重复与合并后NaN值问题
为什么合并后会出现重复索引和NaN值?
你用pd.concat()按默认的行方向(axis=0)合并四个DataFrame时,Pandas会执行外连接(outer join):
- 每个原始DataFrame的行都会被保留,哪怕它们的索引完全相同(比如
df1和df2共享所有(Room, User, Task)索引) - 因为每个原始DF只有一列(
1或2),所以在其他DF没有的列位置会填充NaN - 最终就出现了同一多重索引重复出现、每行仅一个有效列值其余为
NaN的结果,这不仅浪费内存,还会增大存储体积。
实现索引唯一、无NaN的高效合并方案
我们的目标是让每个(Room, User, Task)组合只出现一次,同时包含所有列(1和2)的有效值。这里有两种简洁的实现方式:
方法1:按列合并同索引DF,再行合并结果
先把共享相同索引的DF按列合并(补全同一索引的所有列),再合并不同任务的结果:
# 合并Play任务的两个DF(列1和列2) df_play = pd.concat([df1, df2], axis=1) # 合并Clean任务的两个DF(列1和列2) df_clean = pd.concat([df3, df4], axis=1) # 最终合并两个任务的完整数据 df_final = pd.concat([df_play, df_clean]).sort_index()
方法2:先行合并所有DF,再按索引分组聚合
如果你的DF数量更多,这种方法更通用——先按行合并所有DF,再通过分组聚合把同一索引下的非NaN值整合到一行:
# 先按行合并所有原始DF df_concat = pd.concat([df1, df2, df3, df4]) # 按多重索引分组,取每个列的第一个非NaN值(因值唯一,first()足够) df_final = df_concat.groupby(level=['Room', 'User', 'Task']).first().sort_index()
验证结果
两种方法得到的df_final都会是无重复索引、无NaN的紧凑结构:
1 2 Room User Task 1 Martin Play 1 1 Clean 6 6 2 Martin Play 2 2 Clean 7 7 3 Martin Play 3 3 Clean 8 8 5 Martin Play 4 4 Clean 9 9 8 Martin Play 5 5 Clean 10 10
这种结构完全消除了冗余数据,能大幅降低内存占用和磁盘存储体积。
内容的提问来源于stack exchange,提问作者user7638008
相关产品推荐
相关产品推荐

