Pandas dataframe.dot 除法

Pandas dataframe.dot division method

我正在尝试 divide 两个不同长度的系列到 return 它们的矩阵乘积数据帧。

我可以用点法将它们相乘 (from this answer):

# Create series
average_read_intervals = pd.Series([10,20,30,40],
                                   index=['a','b','c','d'])
region_lengths = pd.Series([100,200,300,400,500,1000],
                           index=['z','y','x','w','v','u'])

# Convert to dataframes
R = pd.DataFrame(region_lengths)
A = pd.DataFrame(average_read_intervals)

# Dot multiplication
R.dot(A.T)
       a      b      c      d
z   1000   2000   3000   4000
y   2000   4000   6000   8000
x   3000   6000   9000  12000
w   4000   8000  12000  16000
v   5000  10000  15000  20000
u  10000  20000  30000  40000

我试过 div 方法,但这只会用 NaN 填充数据框:

In [17]: R.div(A.T)
Out[17]: 
    0   a   b   c   d
0 NaN NaN NaN NaN NaN
u NaN NaN NaN NaN NaN
v NaN NaN NaN NaN NaN
w NaN NaN NaN NaN NaN
x NaN NaN NaN NaN NaN
y NaN NaN NaN NaN NaN
z NaN NaN NaN NaN NaN

同样,标准 division 运算符也 return 得到相同的结果:

In [18]: R / A.T
Out[1]: 
    0   a   b   c   d
0 NaN NaN NaN NaN NaN
u NaN NaN NaN NaN NaN
v NaN NaN NaN NaN NaN
w NaN NaN NaN NaN NaN
x NaN NaN NaN NaN NaN
y NaN NaN NaN NaN NaN
z NaN NaN NaN NaN NaN

所以我对我的问题的正确解决方案感到有点困惑。

非常感谢任何帮助。

我不相信你可以 pandas,或者至少不会那样。 div 是逐元素运算,类似于 mul,而不是像 dot 那样的矩阵运算(尝试 A.mul(A) 或等效地 A * A)。*

只有当所讨论的矩阵是 nonsingular 时才能进行矩阵除法(乘以逆矩阵),而您的 A 肯定不是,因为它不是正方形。

Numpy 有一个 compute the inverse of a matrix 的函数,如果你的矩阵是不同的形状,你可以使用它。

就是说,在你的情况下,你基本上想在 R 的一些当前不存在的列上广播 average_read_intervals,你可以通过改变 R 的形状来设计它复制其列 len(average_read_intervals) 次。

# Make R into a 6 by 4 matrix with the correct column headings.
R = R.join([R.rename(columns={0: col}) for col in average_read_intervals.index]).ix[:, 1:]
R
      a     b     c     d
z   100   100   100   100
y   200   200   200   200
x   300   300   300   300
w   400   400   400   400
v   500   500   500   500
u  1000  1000  1000  1000


# Divide by Series (broadcast over D)
R / average_read_intervals

     a   b          c     d
z   10   5   3.333333   2.5
y   20  10   6.666667   5.0
x   30  15  10.000000   7.5
w   40  20  13.333333  10.0
v   50  25  16.666667  12.5
u  100  50  33.333333  25.0

但几乎肯定有更好的方法来做到这一点。 (希望有人会加入:)

* 这并不总是正确的,因为它们会 broadcast 取决于操作数的形状。

要进行逐元素除法操作,您可以像这样划分每个数据框的值:

matrix_div = pd.DataFrame(R.values/A.T.values, index=R.index, columns=A.index)

生成所需的

矩阵
     a   b          c     d
z   10   5   3.333333   2.5
y   20  10   6.666667   5.0
x   30  15  10.000000   7.5
w   40  20  13.333333  10.0
v   50  25  16.666667  12.5
u  100  50  33.333333  25.0