pandas - 左合并后令人困惑的熊猫索引变化
问题描述
我有一个数据框,我对特定行感兴趣。当我跑
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 的行,那么我可以看到合并数据框的行数如何比合并中的左数据框多,但事实并非如此,那么为什么行移动了?
(注意,对不起,我无法给出清晰的代码示例。当我尝试生成测试数据时,行索引更改不会发生,它只会发生在我的真实数据上。)
解决方案
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
推荐阅读
- image - Xamarin Forms XAML 图像控件已停止工作
- ruby-on-rails - Ruby on Rails/PostGRE - 没有运算符匹配给定的名称和参数类型。错误
- javascript - 单行的Angular6多个ngFor-如何在一个ngFor中传递两个值
- database - MD5 是否有足够的哈希空间来指纹文件?
- haskell - 单子 = 函子 + 幂等性(类型)?
- python - Pandas 时间序列:常规 10 分钟窗口内不规则间隔数据的分组和滚动平均值
- python - Python,请求,错误 = http.client.BadStatusLine:
- javascript - Firefox 中 contenteditable 的换行错误
- python - 将 pandas 数据框行组合成一个向量
- javascript - Javascript - 有条件地使用域名