发布
社区首页 >问答首页 >将数据之和为MultiIndex

将数据之和为MultiIndex
EN

Stack Overflow用户
提问于 2018-11-05 10:04:00
回答 2查看 64关注 0票数 3

我有两个不同索引的DataFrames,如下所示:

代码语言:javascript
代码运行次数:0
复制
import pandas as pd
a = pd.DataFrame([1, 2, 3], index=['a', 'b', 'c'],
columns=['one'])
b = pd.DataFrame([5, 6], index=['d', 'e'],
columns=['two'])

我可以使用以下方法创建“笛卡尔”MultiIndex:

代码语言:javascript
代码运行次数:0
复制
a_plus_b = pd.MultiIndex.from_product([a.index,b.index])

它变成一个空的MultiIndex:

代码语言:javascript
代码运行次数:0
复制
MultiIndex(levels=[['a', 'b', 'c'], ['d', 'e']],
       labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]])

如何像下面这样创建笛卡尔和?

代码语言:javascript
代码运行次数:0
复制
'a' 'd' 6 # 1 + 5
    'e' 7 # 1 + 6
'b' 'd' 7 # 2 + 5
    'e' 8 # 2 + 6
'c' 'd' 8 # 3 + 5
    'e' 9 # 3 + 6
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-05 10:15:21

通过使用MultiIndex,可以避免显式创建pd.merge的中间步骤。

代码语言:javascript
代码运行次数:0
复制
res = pd.merge(a.rename_axis('A').reset_index().assign(key=1),
               b.rename_axis('B').reset_index().assign(key=1), on='key')

res = res.assign(total=res['one'] + res['two'])\
         .groupby(['A', 'B'])['total'].sum()

print(res)

A  B
a  d    6
   e    7
b  d    7
   e    8
c  d    8
   e    9
Name: total, dtype: int64
票数 1
EN

Stack Overflow用户

发布于 2018-11-05 10:07:51

按第一级和第二级使用reindex

代码语言:javascript
代码运行次数:0
复制
s = a['one'].reindex(a_plus_b, level=0) + b['two'].reindex(a_plus_b, level=1)
print (s)
a  d    6
   e    7
b  d    7
   e    8
c  d    8
   e    9
dtype: int64
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53152117

复制
相关文章

相似问题

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