私はCourseraでコースをやっており、いくつかの操作を実行するためのデータセットがあります。私は問題への答えを得たが、私の答えは計算に時間がかかる。パンダで行操作をより速くする
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)
期待通りの結果が得られます。サンプルは
の下に示されているが、全体のプロセスが完了するまでに分以上かかります。元のデータフレームには約10370個の列があります。
私は、forループと機能の適用を高速化する方法があるかどうかはわかりません。時間の大部分は、私のquarter_rows()
機能の中のforループに取り込まれています。 私はpython lambdaを試しましたが、私が試したあらゆる方法で例外がスローされました。 私は実際にforループを使わずに3つの連続した値を使って平均を得る方法を見つけることに興味があります。
おかげ
編集ありがとう – Parousia