我有两个熊猫系列,每个系列都有不同的索引:
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)
沿着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
的方向指示大熊猫在执行ufunc之前沿1轴广播b(例如,乘以,升高等等)。有没有比使用apply更好的方法?
{{1}}
答案 0 :(得分:4)
您可以使用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 ufunc come with 5 methods:outer
,accumulate
,reduce
,reduceat
和at
。所以编写上述解决方案的另一种方法是
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
' outer
方法:
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