python - 与 Pandas 合并后设置索引?

标签 python pandas dataframe merge series

执行以下合并

import pandas as pd
s = pd.Series(range(5, 10), index=range(10, 15), name='score')
df = pd.DataFrame({'id': (11, 13), 'value': ('a', 'b')})
pd.merge(s, df, 'left', left_index=True, right_on='id')

导致这个数据框:
     score  id value
NaN      5  10   NaN
0.0      6  11     a
NaN      7  12   NaN
1.0      8  13     b
NaN      9  14   NaN

为什么 Pandas 将右侧数据帧的索引作为结果的索引,而不是左侧系列的索引,即使我同时指定了左侧合并和 left_index=True ? documentation

left: use only keys from left frame



我对它的解释与我实际得到的结果不同。我所期望的是以下数据框。
    score  id value
10      5  10   NaN
11      6  11     a
12      7  12   NaN
13      8  13     b
14      9  14   NaN

我正在使用 Python 3.7.5 和 Pandas 0.25.3。

最佳答案

这是发生的事情:

  • 输出索引是索引/列合并键的交集[0, 1] .
  • 缺少的键被替换为 NaN
  • NaN 导致索引类型向上转换为 float

  • 要设置索引,只需分配给它:
    s2 = pd.merge(s, df, how='left', left_index=True, right_on='id')
    s2.index = s.index
    
        score  id value
    10      5  10   NaN
    11      6  11     a
    12      7  12   NaN
    13      8  13     b
    14      9  14   NaN
    

    您也可以在 s 上合并(只是因为我不喜欢直接调用pd.merge):
    (s.to_frame()
      .merge(df, how='left', left_index=True, right_on='id')
      .set_axis(s.index, axis=0, inplace=False))
    
        score  id value
    10      5  10   NaN
    11      6  11     a
    12      7  12   NaN
    13      8  13     b
    14      9  14   NaN
    

    关于python - 与 Pandas 合并后设置索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59293626/

    相关文章:

    python - 两个客户端和一台服务器之间的 Rpyc 接口(interface)

    python - 为什么我的基本 PyGame 模块这么慢?

    python - 根据索引前缀在列中设置值的最有效方法

    r - 如何使数据框中的因子水平在所有列之间保持一致?

    python - pandas DataFrame 中的级别是什么?

    python - 将多个 pandas 行组合成不同标题的单个记录

    python - 填充 NaN 时'numpy.float6 4' object has no attribute ' fillna'

    python - Pandas 在交叉值中找到重复项

    python - 合并两个数据框而不丢失列值

    python - 通过 id 列表过滤 pandas 数据框