执行以下合并
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一起使用。
答案 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)
会发生什么:
[0, 1]
的交集。 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的答案保留为可接受的答案,但是我认为也需要记录此用例。