2016-11-21 5 views
0

私は、その中に測定値を持つデータフレームと、それらの測定値に統計値を持つ2番目のデータフレームを持っています。例:他の列の関数であるパンダデータフレームに列を追加する

def calc_zscore(x, mean, stdev): 
    return (x - mean)/stdev 


metrics = ['Temperature', 'Length', 'Width'] 
values = ['mean', 'stdev'] 

data = pd.DataFrame(columns = metrics) 
stats = pd.DataFrame(index = metrics, columns = values) 

stats.ix['Temperature', 'mean'] = 72.1 
stats.ix['Temperature', 'stdev'] = 6.3 

data.loc[0, 'Temperature'] = 68.2 
data.loc[1, 'Temperature'] = 76.2 
data.loc[2, 'Temperature'] = 73.6 

metric = 'Temperature' 

for row in data.index: 

    data.ix[row, metric + '_zscore'] = calc_zscore(data.ix[row, metric], stats.ix[metric, 'mean'], stats.ix[metric, 'stdev']) 

print data 

これは私の望むように機能しますが、データフレームのすべての行を繰り返し処理する必要があります。それは遅く、データフレームには300kの行があります。私はまた、各列のz_scoreを計算する必要がありますが、単純なままにするために、この例ではTemperatureカラムだけを行っています。適用()メソッドを使用して

Temperature Length Width Temperature_zscore 
0  68.2 NaN NaN   -0.619048 
1  76.2 NaN NaN   0.650794 
2  73.6 NaN NaN   0.238095 

は)しかし、私は(適用使っcalc_zscore関数に正しい値を渡す方法がわからないんだけど、魔法の天のパンダへのパスのようです。

PS私は実際にzスコアを計算していないので、これを例として使用しています。私はmean()とstd()メソッドを使うこともできますが、それは単なる例であり、存在しないふりをしましょう。

+0

適用行くための一つの方法ですが、単純なデータ[ 'RESを使用して、次に「データ」のデータフレームに「統計情報」を結ぶ場合、私は疑問に思う:

from functools import partial mean = 5.0 stdv = 2.0 def yourfunc(x, m, s): return (x - m)/s partfunc = partial(yourfunc, m=mean, s=stdv) 

その後は、部分的な機能があることを適用します'] = data [' x '] - データ[' y ']スタイルの列の作成は、より高速かもしれません。 – Karnage

答えて

0

これはあなたのforループと等価です:の答えをpalakoに加えて

data['Temperature_zscore'] = data['Temperature'].apply(calc_zscore, args=(stats.ix[metric, 'mean'], stats.ix[metric, 'stdev'])) 
0

、あなたが適用されている関数に引数を渡すことができる方法を示している、あなたはまた、適用にラムダ関数を使用することができます。

data['Temp_zscore'] = data['Temperature'].apply(lambda x: calc_zscore(x, stats.ix[metric, 'mean'], stats.ix[metric, 'stdev'])) 

また、functoolsからpartialを作成することを検討。

data['Temp_zscore'] = data['Temperature'].apply(partfunc) 
関連する問題