Python / pandas: 设置和获取数据的最快方法,不使用链式赋值
我正在进行一些操作,从一个 pandas 数据框中获取标量和向量,然后在经过一些计算后设置结果。
最开始我使用 df[var][index] 这种方式来做,但遇到了链式赋值的问题(http://pandas.pydata.org/pandas-docs/dev/indexing.html%23indexing-view-versus-copy)。
所以我改用了 df.loc[index,var]。这样解决了视图/复制的问题,但速度很慢。对于数组,我把它转换成 pandas 系列,然后使用内置的 df.update()。现在我在寻找最快、最好的方法来做到这一点,而不必担心链式赋值的问题。在文档中,他们说比如 df.at[] 是访问标量的最快方式。有没有人有这方面的经验?或者能推荐一些相关的资料吗?
谢谢
编辑:代码看起来像这样,我觉得这很标准。
def set_var(self,name,periode,value):
try:
if navn.upper() not in self.data:
self.data[name.upper()]=num.NaN
self.data.loc[periode,name.upper()]=value
except:
print('Fail to set'+navn])
def get_var(self,navn,periode):
''' Get value '''
try:
value=self.data.loc[periode,navn.upper()]
def set_series(data, index):
outputserie=pd.Series(data,index)
self.data.update(outputserie)
dataframe looks like this:
SC0.data
<class 'pandas.core.frame.DataFrame'>
PeriodIndex: 148 entries, 1980Q1 to 2016Q4
Columns: 3111 entries, CAP1 to CHH_DRD
dtypes: float64(3106), int64(2), object(3)
edit2:
一个 df 可能看起来像这样
var var1
2012Q4 0.462015 0.01585
2013Q1 0.535161 0.01577
2013Q2 0.735432 0.01401
2013Q3 0.845959 0.01638
2013Q4 0.776809 0.01657
2014Q1 0.000000 0.01517
2014Q2 0.000000 0.01593
我基本上想执行两个操作:
1) 也许在所有时间段内用相同的标量更新 var1。
2) 计算 2014Q1 的 var,公式是 var,2013Q4 = var1,2013Q3/var2013Q4*var,2013Q4。
这部分是一个更大模型设置的一部分,模型是从一个文本文件中读取的。因为我需要进行很多这样的计算,所以设置和读取数据的速度很重要。
1 个回答
0
你上面给的例子可以用向量化的方法来处理。
In [3]: df = DataFrame(dict(A = np.arange(10), B = np.arange(10)),index=pd.period_range('2012',freq='Q',periods=10))
In [4]: df
Out[4]:
A B
2012Q1 0 0
2012Q2 1 1
2012Q3 2 2
2012Q4 3 3
2013Q1 4 4
2013Q2 5 5
2013Q3 6 6
2013Q4 7 7
2014Q1 8 8
2014Q2 9 9
给一个标量(就是一个单一的数值)赋值
In [5]: df['A'] = 5
In [6]: df
Out[6]:
A B
2012Q1 5 0
2012Q2 5 1
2012Q3 5 2
2012Q4 5 3
2013Q1 5 4
2013Q2 5 5
2013Q3 5 6
2013Q4 5 7
2014Q1 5 8
2014Q2 5 9
进行一个偏移操作
In [8]: df['C'] = df['B'].shift()/df['B'].shift(2)
In [9]: df
Out[9]:
A B C
2012Q1 5 0 NaN
2012Q2 5 1 NaN
2012Q3 5 2 inf
2012Q4 5 3 2.000000
2013Q1 5 4 1.500000
2013Q2 5 5 1.333333
2013Q3 5 6 1.250000
2013Q4 5 7 1.200000
2014Q1 5 8 1.166667
2014Q2 5 9 1.142857
使用向量化的赋值方式
In [10]: df.loc[df['B']>5,'D'] = 'foo'
In [11]: df
Out[11]:
A B C D
2012Q1 5 0 NaN NaN
2012Q2 5 1 NaN NaN
2012Q3 5 2 inf NaN
2012Q4 5 3 2.000000 NaN
2013Q1 5 4 1.500000 NaN
2013Q2 5 5 1.333333 NaN
2013Q3 5 6 1.250000 foo
2013Q4 5 7 1.200000 foo
2014Q1 5 8 1.166667 foo
2014Q2 5 9 1.142857 foo