与 pandas 合并后设置索引?
Setting the index after merging with pandas?
正在执行以下合并
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。
您可以使用 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
事情是这样的:
- 输出索引是 index/column 个合并键
[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
由于我不需要 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 的答案保留为可接受的答案,但我认为这个用例也需要记录下来。
正在执行以下合并
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。
您可以使用 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
事情是这样的:
- 输出索引是 index/column 个合并键
[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
由于我不需要 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 的答案保留为可接受的答案,但我认为这个用例也需要记录下来。