与大熊猫合并后设置索引?

时间:2019-12-11 20:31:37

标签: 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

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

  

左:仅使用左框中的键

我对

的解释与我实际得到的结果不同。我期望的是以下数据框。

    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一起使用。

3 个答案:

答案 0 :(得分:2)

您可以使用reset_index进行此操作:

df = pd.merge(s,df, 'left', left_index=True, right_on='id').reset_index(drop=True).set_index('id').rename_axis(index=None)
df.insert(1, 'id', df.index)

    score  id value
10      5  10   NaN
11      6  11     a
12      7  12   NaN
13      8  13     b
14      9  14   NaN

答案 1 :(得分:2)

会发生什么:

  1. 输出索引是索引/列合并键[0, 1]的交集。
  2. 缺失键替换为NaN
  3. 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

答案 2 :(得分:0)

由于我既不需要id列又不需要索引中的重复信息,因此我结合了cs95和oppressionslayer的答案,并执行以下操作:

pd.merge(s, df, 'left', left_index=True, right_on='id').set_index('id')

这将导致以下数据帧:

    score value
id             
10      5   NaN
11      6     a
12      7   NaN
13      8     b
14      9   NaN

由于这与我最初要求的不同,因此我将cs95的答案保留为可接受的答案,但是我认为也需要记录此用例。