在 Scipy 中使用 pandas 数据框
Posted
技术标签:
【中文标题】在 Scipy 中使用 pandas 数据框【英文标题】:Using pandas dataframe with Scipy 【发布时间】:2017-10-30 23:12:17 【问题描述】:假设一个数据框,df,使用大小为 n x m 的 pandas。
我想对 df 进行线性代数运算。
直到现在,我还没有找到一种方法来直接在 df 上执行线性代数。我能找到的是如何将 df 从 pandas 格式转换为 Numpy 使用:
A = DataFrame.as_matrix
那我就简单了
linalg.inv(A)
有没有使用 pandas 数据框在 Scipy 中执行线性运算的直接方法?例如:
linalg.inv(df)
我想使用 scipy 而不是 Numpy 的线性代数运算的原因是:
无论如何,SciPy 包含功能更全面的线性代数模块版本,以及许多其他数值算法。如果您使用 python 进行科学计算,您可能应该同时安装 NumPy 和 SciPy。大多数新功能属于 SciPy 而不是 NumPy。
来自What-is-the-difference-between-NumPy-and-SciPy
【问题讨论】:
pandas
和 scipy
都建立在 numpy
之上。大多数scipy
代码假定输入是数组,或者可以转换为数组。 scipy
inv
将输入转换为numpy
数组(使用np.asarray
)。如果数据框在 scipy 函数中工作,那是因为它可以转换为数组。
【参考方案1】:
您可以直接在 DataFrames 上使用它。
演示:
In [111]: from scipy.linalg import inv
In [112]: df = pd.DataFrame(np.random.rand(5,5), columns=list('abcde'))
In [113]: df
Out[113]:
a b c d e
0 0.619086 0.229390 0.361611 0.857177 0.274983
1 0.389630 0.689562 0.687043 0.388781 0.781168
2 0.702920 0.253870 0.881173 0.858378 0.363035
3 0.007022 0.571111 0.408729 0.708862 0.042882
4 0.876747 0.170775 0.499824 0.929295 0.762971
In [114]: inv(df)
Out[114]:
array([[ 5.67652746, 1.54854922, -0.21927114, -3.04884324, -3.35567433],
[ 4.32996215, 1.99787442, -1.18579234, -0.9802008 , -2.98677673],
[-2.43833426, -0.29287732, 2.11691208, 0.34655505, 0.1519223 ],
[-1.92398165, -1.43903773, -0.22722582, 1.96404685, 2.16451337],
[-3.55144126, -0.28205091, -0.59264783, 1.10366465, 3.09938364]])
PS 我在这个演示中使用了Pandas 0.19.2
和SciPy 0.18.1
。
更新:如果你想得到一个 DataFrame 作为结果:
In [4]: pd.DataFrame(inv(df), columns=df.columns, index=df.index)
Out[4]:
a b c d e
0 5.676507 1.548541 -0.219275 -3.048828 -3.355657
1 4.329938 1.997865 -1.185791 -0.980187 -2.986760
2 -2.438323 -0.292872 2.116913 0.346547 0.151914
3 -1.923971 -1.439034 -0.227226 1.964040 2.164506
4 -3.551428 -0.282045 -0.592647 1.103655 3.099373
【讨论】:
在您的示例中执行 inv(df) 后,我得到 Numpy 数组,对吗? @Eagle,我不能说它是否正确......问题是 - 你想达到什么目标? ;-)以上是关于在 Scipy 中使用 pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章
在 scipy/pandas 中用 Pearson 的 r 删除 'nan'