Python / pandas: 设置和获取数据的最快方法,不使用链式赋值

0 投票
1 回答
502 浏览
提问于 2025-04-18 07:04

我正在进行一些操作,从一个 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

撰写回答