python-如何广播具有不同索引的 pandas 系列?

我有两个 pandas 系列,每个都有不同的索引:

In [2]: a = pd.Series(range(5), index=pd.Index(list('abcde'), name='index'))
In [3]: b = pd.Series(range(4), index=pd.Index(list('ABCD'), name='BIG_INDEX'))

我想做的是沿着a.mul(b,axis = 1)的指令来指示大 pandas 在执行ufunc之前沿1轴广播b(例如乘以,提高n的幂等).有比使用Apply更好的方法吗?

In [4]: a.apply(lambda x: x*b)
Out[4]:
BIG_INDEX  A  B  C   D
index
a          0  0  0   0
b          0  1  2   3
c          0  2  4   6
d          0  3  6   9
e          0  4  8  12

最佳答案

您可以使用numpy.outer来执行计算,就好像a和b是数组一样:

In [285]: pd.DataFrame(np.outer(a, b), columns=b.index, index=a.index)
Out[285]: 
BIG_INDEX  A  B  C   D
index                 
a          0  0  0   0
b          0  1  2   3
c          0  2  4   6
d          0  3  6   9
e          0  4  8  12

这比调用a.apply(lambda x:x * b)更快.

顺便说一下,所有NumPy ufuncs come with 5 methods:外部,累积,减少,减少和减少.所以写上述解决方案的另一种方法是

In [34]: pd.DataFrame(np.multiply.outer(a, b), columns=b.index, index=a.index)
Out[36]: 
BIG_INDEX  A  B  C   D
index                 
a          0  0  0   0
b          0  1  2   3
c          0  2  4   6
d          0  3  6   9
e          0  4  8  12

并且当以这种方式编写时,很明显如何将相同的想法应用于任何NumPy ufunc.例如,要从a和b中制作和添加表,请调用np.add的外部方法:

In [37]: pd.DataFrame(np.add.outer(a, b), columns=b.index, index=a.index)
Out[37]: 
BIG_INDEX  A  B  C  D
index                
a          0  1  2  3
b          1  2  3  4
c          2  3  4  5
d          3  4  5  6
e          4  5  6  7