首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pandas多索引数据帧合并问题

Pandas多索引数据帧合并问题
EN

Stack Overflow用户
提问于 2020-12-15 00:52:58
回答 1查看 363关注 0票数 0

我想合并两个数据帧,df1和df2,它们有多个索引列:

代码语言:javascript
运行
复制
mi1 = pd.MultiIndex.from_tuples([('id', '0'), ('car', '2018')], names=['variable', 'year'])
mi2 = pd.MultiIndex.from_tuples([('id', '0'), ('car', '2019')], names=['variable', 'year'])
df1 = pd.DataFrame([['alice', 1], ['bob', 2]], columns=mi1)
df2 = pd.DataFrame([['alice', 2], ['bob', 3]], columns=mi2)

在df1和df2中,第一列索引引用变量名,而第二列索引引用年份。一些变量,如本例中的'id‘,与特定年份无关,因此值为'0’,在这里没有关联。

代码语言:javascript
运行
复制
df1
variable     id  car
year          0 2018
0         alice    1
1           bob    2

df2
variable     id  car
year          0 2019
0         alice    2
1           bob    3

我想合并df1和df2以获得:

代码语言:javascript
运行
复制
variable     id  car  car
year          0 2018 2029
0         alice    1    2
1           bob    2    3

问题是,应用于df1和df2的使用'id‘列的合并函数返回一条错误消息:

代码语言:javascript
运行
复制
df3 = pd.merge(df1, df2, on=('id', '0'), how="outer")

Traceback (most recent call last):
  File "<input>", line 5, in <module>
  File "C:\Users\AA\AppData\Roaming\Python\Python37\site-packages\pandas\core\reshape\merge.py", line 87, in merge
    validate=validate,
  File "C:\Users\AA\AppData\Roaming\Python\Python37\site-packages\pandas\core\reshape\merge.py", line 652, in __init__
    ) = self._get_merge_keys()
  File "C:\Users\AA\AppData\Roaming\Python\Python37\site-packages\pandas\core\reshape\merge.py", line 1005, in _get_merge_keys
    right_keys.append(right._get_label_or_level_values(rk))
  File "C:\Users\AA\AppData\Roaming\Python\Python37\site-packages\pandas\core\generic.py", line 1580, in _get_label_or_level_values
    f"The {label_axis_name} label '{key}' "
ValueError: The column label 'id' is not unique.
For a multi-index, the label must be a tuple with elements corresponding to each level.

这非常令人惊讶--也令人沮丧--因为merge函数的'on‘参数有一个元组作为参数,所以这里不应该有问题。我需要使用合并函数,因为在现实中,要合并的数据帧更加复杂,并且没有相同的id列。

你能告诉我如何解决这个问题并合并两个具有多索引列的数据帧吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-15 01:12:39

这里的问题是on可以使用一个或多个列来合并两个数据帧

所以当你传递on=('id', '0')的时候,它会认为你想合并两个字段。编写on=[('id', '0')]可以消除歧义。一个要合并的列和两个指定为多索引一部分的标签:

代码语言:javascript
运行
复制
df3 = pd.merge(df1, df2, on=[('id', '0')], how="outer")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65293068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档