2017-01-14 3 views
2

私はCourseraでコースをやっており、いくつかの操作を実行するためのデータセットがあります。私は問題への答えを得たが、私の答えは計算に時間がかかる。パンダで行操作をより速くする

Hereは元のデータセットで、サンプルのスクリーンショットは以下のとおりです。

enter image description here

タスクは、私は上の集約2000-01、2000-02、2000-03データ2000-Q1のソートする必要が四半期値即ちまで毎月の値からデータを変換することです。 2000-Q1の新しい値は、これらの3つの値の平均値でなければなりません。 同様に、2000-04、2000-05、2000-06は2000-Q2になり、新しい値は2000-04、2000-05、2000-06の平均値になります。

ここで問題をどのように解決しましたか。

最初に、データ列(系列として)を取り、列インデックスを使用して3番目の要素ごとにループし、いくつかの値(インプレース)を上記のように計算された平均値に置き換え、

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' : ] 

で動作するために必要なものだけ残すデータの一部サブセット化とクリーンアップを行います。

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

期待通りの結果が得られます。サンプルは

enter image description here

の下に示されているが、全体のプロセスが完了するまでに分以上かかります。元のデータフレームには約10370個の列があります。

私は、forループと機能の適用を高速化する方法があるかどうかはわかりません。時間の大部分は、私のquarter_rows()機能の中のforループに取り込まれています。 私はpython lambdaを試しましたが、私が試したあらゆる方法で例外がスローされました。 私は実際にforループを使わずに3つの連続した値を使って平均を得る方法を見つけることに興味があります。

おかげ

+0

編集ありがとう – Parousia

答えて

1

私はあなたがquartersと集計meanによって代わりapply使用resampleを使用することができると思うが、最初to_periodによってmonth期間に列名を変換:

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 
+0

うわー!!!魔法のように働いた。ありがとう。私は間違いなくリンクをチェックアウトします。 – Parousia

+0

私の質問への答えは別の問題、PeriodIndex形式の新しい列を文字列に変換する方法につながったと付け加えたいと思います。この投稿は役に立ちますhttp://stackoverflow.com/questions/34800343/python-pandas-convert-type-from-pandas-period-to-string – Parousia

+0

よろしくお願いします。そして助けがあれば、アップヴォートすることができます。私または別の答え。どちらもうまくいく。 – jezrael

関連する問題