python - 将两个多索引数据帧与不同但相似的索引和列相乘

标签 python pandas dataframe multi-index

请考虑这两个数据框。

import pandas as pd
cols = ['F', 'D']

s_ind = pd.MultiIndex.from_arrays([['A', 'A', 'A'], ['B', 'B', 'B'], ['C', 'C', 'C'], ['D', 'E', 'F']],
                                  names=('cat1', 'cat2', 'cat3', 'cat4'))
s = pd.DataFrame(data=[[1,4], [2,5], [3,6]], columns=cols, index=s_ind)

所以 s 是:


                      F  D
cat1 cat2 cat3 cat4      
A    B    C    D     1  4
               E     2  5
               F     3  6

和...

ib_ind = pd.MultiIndex.from_arrays([['A'], ['B'], ['C']], names=['cat1', 'cat2', 'cat3'])
ib = pd.DataFrame(data=[[7, 8]], columns=cols, index=ib_ind)

所以 ib 是:

                 F  D
cat1 cat2 cat3      
A    B    C     7  8

无论我使用轴 0(显示)还是轴 1(未显示)相乘,我都会收到相同的结果。看这里:

print(ib.mul(s, axis=0))
                      F   D
cat1 cat2 cat3 cat4        
A    B    C    D      7  32
               E     14  40
               F     21  48

问题:如何执行乘法以便将其作为输出接收?

print(pd.DataFrame(data=[[8*1,8*4], [0,0], [7*3,7*6]], columns=cols, index=s_ind))
                      F   D
cat1 cat2 cat3 cat4        
A    B    C    D      8  32
               E      0   0
               F     21  42

注意E行为0是因为ib中没有对应的E列可以相乘。或者,nans 也可以。

最佳答案

你可以试试unstack对于 smultiply ibaxis=1 上的 level=1,然后是 stack它回来了reindex使用 fill_value=0

final = ib.mul(s.unstack(),level=1,axis=1).stack().reindex(s.index,fill_value=0)
# or: ib.mul(s.unstack('cat4'),level=1,axis=1).stack().reindex(s.index,fill_value=0)

@piRSquared 建议的另一种方法只涉及一次 reshape (因此更快)是 rename乘法时要匹配的索引的索引然后 stackreindex 相乘后:

s.mul(ib.rename_axis('cat4', axis=1).stack().reindex(s.index, fill_value=0), axis=0) 

                        F     D
cat1 cat2 cat3 cat4            
A    B    C    D      8.0  32.0
               E      0.0   0.0
               F     21.0  42.0

关于python - 将两个多索引数据帧与不同但相似的索引和列相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60044177/

相关文章:

python - 在 Python 和 NumPy 中量化正态分布 float

python - 使用分层索引更改数据框中的数据

python - 使用 Pandas .groupby 时,为什么要使用 .agg 而不是直接使用函数,例如 .sum()

python - InterX 到 python 的翻译代码出现故障

python - Seaborn FacetGrid 上的 Pandas 图

python - 在 python 3.7 中使用 paho mqtt 客户端的问题

python - 读取数据集并使用 Pandas 对一些信息进行分组

python-3.x - 有条件地乘以 DataFrame 行中的值

python - 通过python中的自定义比较器对元组列表进行排序

python - 对完整字符串数据帧进行一次热编码