Skip to content
Advertisement

Pandas dataframe.dot division method

I am trying to divide two series of different length to return the matrix product dataframe of them.

I can multiply them using the dot method (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

I’ve tried the div method, but this just fills the dataframe with NaNs:

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

Likewise the standard division operator also returns the same result:

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

So I’m a bit stumped as to what the correct solution is to my problem.

Any help is gratefully appreciated.

Advertisement

Answer

To do an element wise division operation you can divide the values of each data frame like so:

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

which produces the desired matrix of

     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
User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement