首页 > 解决方案 > 左合并后令人困惑的熊猫索引变化

问题描述

我有一个数据框,我对特定行感兴趣。当我跑

questionnaire_events[questionnaire_events['event_id'].eq(6506308)]

我得到了这一行,它的索引是 7,816。然后我将问卷调查事件与另一个数据框合并

merged = questionnaire_events.merge(
    ordinals,
    how='left',
    left_on='event_id',
    right_on='id')

(值得注意的是,序数数据框没有 NaN 也没有重复的 id,但问卷调查事件确实有一些行具有事件 ID 的 NaN 值。)

merged[merged['event_id'].eq(6506308)]

结果行的索引为 7,581。为什么?合并中发生了什么,左外部合并,意味着我的行已从 7,816 移动到 7,581?如果序数数据框中有多个具有相同 id 的行,那么我可以看到合并数据框的行数如何比合并中的左数据框多,但事实并非如此,那么为什么行移动了?

(注意,对不起,我无法给出清晰的代码示例。当我尝试生成测试数据时,行索引更改不会发生,它只会发生在我的真实数据上。)

标签: pandas

解决方案


pd.DataFrame.merge不保留原始数据名索引。

df1 = pd.DataFrame({'key':[*'ABCDE'], 'val':[1,2,3,4,5]}, index=[100,200,300,400,500])

print('df1 dataframe:')
print(df1)
print('\n')
df2 = pd.DataFrame({'key':[*'AZCWE'], 'val':[10,20,30,40,50]}, index=[*'abcde'])
print('df2 dataframe:')
print(df2)
print('\n')

df_m = df1.merge(df2, on='key', how='left')
print('df_m dataframe:')
print(df_m)

现在,如果您的 df1 是默认范围索引,那么您可能会在合并的数据框中获得不同的索引。如果您对 df1 进行子集化或过滤,那么您的索引将不匹配。

解决方法:

df1 = df1.reset_index()
df_m2 = df1.merge(df2, on='key', how='left')
df_m2 = df_m2.set_index('index')
print('df_m2 work around dataframe:')
print(df_m2)

输出:

df_m2 work around dataframe:
      key  val_x  val_y
index                  
100     A      1   10.0
200     B      2    NaN
300     C      3   30.0
400     D      4    NaN
500     E      5   50.0

推荐阅读