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
我正在尝试 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