pandas - 左合并后令人困惑的 pandas 索引变化

标签 pandas

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

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

我得到了该行,它的索引是 7,816。然后我将 Questionnaire_events 与另一个数据框合并

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

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

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

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

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

最佳答案

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

关于pandas - 左合并后令人困惑的 pandas 索引变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60286376/

相关文章:

python - 使用 python requests 和 BeatifulSoup 在维基百科页面上抓取多个表及其标题?

python - 如果第二列与给定的 Pandas 列表匹配,则替换数据框列中的值

python - Pandas :错误计算行数

python - Pandas :如何计算一列与其他多列之间的相关性?

python - Pandas:将日期间隔转换并合并到面板中的虚拟变量中

pandas - "ValueError: Merge keys contain null values on right side"使用 pd.merge_asof

python - 使用 AND 或 OR 选项在多列数据框中进行多字符串搜索

python - 如何处理整数值列中的非数字条目

python - Series.replace 和 Series.str.replace 有什么区别?

Python:Z 分数参数计算