在pandas中加快行操作

时间:2017-01-14 21:40:27

标签: python pandas

我正在Coursera上做一个课程,我有一个数据集来执行一些操作。我已经得到了问题的答案,但我的答案需要时间来计算。

Here是原始数据集,下面提供了一个示例屏幕截图。

enter image description here

任务是将数据从月度值转换为季度值,即我需要将2000-01,2000-02,2000-03的汇总数据分类为2000-Q1,依此类推。 2000-Q1的新值应该是这三个值的平均值。 同样,2000-04,2000-05,2000-06将成为2000年第二季度,新值应该是2000-04,2000-05,2000-06的平均值

以下是我解决问题的方法。

首先我定义了一个函数quarter_rows(),它接受​​一行数据(作为一个序列),使用列索引遍历每个第三个元素,用一个如上所述计算的平均值替换一些值(就地)返回行

import pandas as pd
import numpy as np
housing = pd.read_csv('City_Zhvi_AllHomes.csv')

def quarter_rows(row):
    for i in range(0, len(row), 3):
        row.replace(row[i], np.mean(row[i:i+3]), inplace=True)
    return row

现在我对数据进行一些子集化和清理,只留下我需要使用的内容

p = ~housing.columns.str.contains('199') # negation of columns starting with 199
housing = housing[housing.columns[p]]
housing3 = housing.set_index(["State","RegionName"]).ix[:, '2000-01' : ]

然后我使用apply将函数应用于所有行。

housing3 = housing3.apply(quarter_rows, axis=1)

我得到了预期的结果。样本如下所示

enter image description here

但整个过程需要一分多钟才能完成。原始数据框有大约10370列。

我不知道是否有办法在for循环中加快速度并应用函数。大部分时间都在我的quarter_rows()函数内的for循环中占用。 我尝试过python lambdas,但我试过的每一种方式都抛出异常。 我真的很想找到一种方法来获得使用三个连续值而不使用for循环的平均值。

由于

1 个答案:

答案 0 :(得分:1)

我认为您可以使用apply quarters使用resample并汇总mean,但首先将列名称转换为month个句点{{3 }}:

housing3.columns = pd.to_datetime(housing3.columns).to_period('M')
housing3 = housing3.resample('Q', axis=1).mean()

测试:

housing = pd.read_csv('City_Zhvi_AllHomes.csv')
p = ~housing.columns.str.contains('199') # negation of columns starting with 199
housing = housing[housing.columns[p]]
#for testing slect only 10 first rows and columns from jan 2000 to jun 2000
housing3 = housing.set_index(["State","RegionName"]).ix[:10, '2000-01' : '2000-06']
print (housing3)
                     2000-01   2000-02   2000-03   2000-04   2000-05   2000-06
State RegionName                                                              
NY    New York           NaN       NaN       NaN       NaN       NaN       NaN
CA    Los Angeles   204400.0  207000.0  209800.0  212300.0  214500.0  216600.0
IL    Chicago       136800.0  138300.0  140100.0  141900.0  143700.0  145300.0
PA    Philadelphia   52700.0   53100.0   53200.0   53400.0   53700.0   53800.0
AZ    Phoenix       111000.0  111700.0  112800.0  113700.0  114300.0  115100.0
NV    Las Vegas     131700.0  132600.0  133500.0  134100.0  134400.0  134600.0
CA    San Diego     219200.0  222900.0  226600.0  230200.0  234400.0  238500.0
TX    Dallas         85100.0   84500.0   83800.0   83600.0   83800.0   84200.0
CA    San Jose      364100.0  374000.0  384700.0  395700.0  407100.0  416900.0
FL    Jacksonville   88000.0   88800.0   89000.0   88900.0   89600.0   90600.0

housing3.columns = pd.to_datetime(housing3.columns).to_period('M')
housing3 = housing3.resample('Q', axis=1).mean()
print (housing3)
                           2000Q1         2000Q2
State RegionName                                
NY    New York                NaN            NaN
CA    Los Angeles   207066.666667  214466.666667
IL    Chicago       138400.000000  143633.333333
PA    Philadelphia   53000.000000   53633.333333
AZ    Phoenix       111833.333333  114366.666667
NV    Las Vegas     132600.000000  134366.666667
CA    San Diego     222900.000000  234366.666667
TX    Dallas         84466.666667   83866.666667
CA    San Jose      374266.666667  406566.666667
FL    Jacksonville   88600.000000   89700.000000