我目前使用.as_matrix()函数,以确保numpy数组保持正确的列顺序;但是,这是要折旧的。通过使用建议的.values函数折旧as_matrix函数后,如何确保保持列顺序?还是有另一种方法?
非常感谢
as_matrix的示例
In: prices.pct_change()[1:].as_matrix(stocks)
Out: array([-0.00283364, 0.0012285 , 0.0014199 , 0.00142983, -0.0053432 ])
值示例
In: prices.pct_change()[1:].values
Out: array([ 0.00142983, 0.0014199 , -0.00283364, -0.0053432 , 0.0012285 ])
最佳答案
如您所指出的,.as_matrix()
已过时。 (与.values
的比较请参见下文。)
无论如何,似乎可以通过先使用.loc
来按各自的顺序获取列:
import pandas as pd
import numpy as np
np.random.seed(444)
prices = pd.DataFrame(np.random.randn(200, 4), columns=list('abcd'))
columns = list('cad')
prices.pct_change().dropna().loc[:, columns].values
这是
.as_matrix()
与.values
的source。您会发现只有一点点不同:def as_matrix(self, columns=None):
warnings.warn("Method .as_matrix will be removed in a future version. "
"Use .values instead.", FutureWarning, stacklevel=2)
self._consolidate_inplace()
return self._data.as_array(transpose=self._AXIS_REVERSED,
items=columns)
@property
def values(self):
self._consolidate_inplace()
return self._data.as_array(transpose=self._AXIS_REVERSED)
因此,如果您确实愿意,可以在没有警告的情况下重新创建
.as_matrix()
。 (但是我强烈希望第一种方法;它是公共API;它不会让您自己处理Pandas内部的Block
类型。)chg = prices.pct_change().dropna()
val = chg._data.as_array(transpose=chg._AXIS_REVERSED, items=columns)
assert np.allclose(val, prices.pct_change().dropna().loc[:, columns].values)