在 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

【问题讨论】:

pandasscipy 都建立在 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.2SciPy 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'

在 Pandas 中使用 Scipy 发出警告

在 Pandas 中使用 Scipy 发出警告

Python Pandas 和 SciPy:识别点和计算移动向量的最佳方法

Python 中的二阶导数 - scipy/numpy/pandas