2017-04-10 8 views
0

私は20年の平均を計算するデータセットを持っています。データは次のようになります。問題パンダを使用してデータセットの全範囲のグループ化されたデータの平均を計算する

1974 1 1 5.3 4.6 7.3 3.4 
1974 1 2 3.3 7.2 4.5 6.5 
... 
2005 12 364 4.2 5.2 3.3 4.6 
2005 12 365 3.1 5.5 2.6 6.8 

あり、ファイルにはヘッダーがありませんが、最初の列は、年二列月、3列目の年の日を含みます。残りの列は温度データです。

私は20年間の各日の平均気温を計算したいと思います。私はそれを行う最善の方法は、日ごとにデータをグループ化し、特定の年の範囲で毎日の平均を計算することだと思いました。ここに私のコードです:

import pandas as pd 

hist_fn = 'tmean_daily_1974_2005.txt' 
twenty_year_fn = '20_yr_mean_1974_1993.txt' 

start = 1974 
end = 1993 

hist_mean = pd.read_csv(hist_fn, sep='\s+', header=None) 

# Limit dataframe to only the 20 years for which I want the mean calculated 
interval_mean = hist_mean[(hist_mean[0]>=start) & (hist_mean[0]<=end)] 

# Rename the first column to reflect what mean this file is displaying 
interval_mean.iloc[:, 0] = ("%s-%s" % (start, end)) 

# Generate mean for each day spread across all the years in the dataframe 
interval_mean.iloc[:, 3:] = interval_mean.groupby(2, as_index=False).mean().iloc[:, 2:] 

# Write multiyear mean to txt 
interval_mean.to_csv(twenty_year_fn, sep='\t', header=False, index=False) 

データセットが20年以上にわたり、私が使用した方法は、最初の20年の期間のために働いていますが、入力された年のその他のセットのために私に(主に)空のテキストファイルを提供します。

私はこれらの入力を使用するときに、それは動作します:

start = 1974 
end = 1993 

、それがこのようなファイル生成:

1974-1993 1 1 4.33 5.25 6.84 3.67 
1974-1993 1 2 7.23 6.22 5.65 6.23 
... 
1974-1993 12 364 5.12 4.34 5.21 2.16 
1974-1993 12 365 4.81 5.95 3.56 6.78 

が、私はこれへの入力を変更します。

start = 1975 
end = 1994 

温度なしの.txtファイルを生成します。

1975-1994 1 1  
1975-1994 1 2  
... 
1975-1994 12 364 
1975-1994 12 365 

この方法が最初の20年間の期間では機能しますが、後続の間隔ではなぜ機能しないのか分かりません。データが整理される方法やスライスされる方法とは関係がありますか?それが邪魔だ今とき

答えて

0

、我々はあなたが提示問題について話すことができます。

奇妙な行動がパンダが割り当て上の指標と一致していることに起因している、とスライスは、元のインデックスを保持し 。それはinterval_meanは、元のインデックスを持って、他が持っていた.On(as_index=FalseはGROUPBY操作は、新しいインデックスを作成しますので、それ以外の場合は、それが一日数されていると思います。)interval_mean.groupby(2, as_index=False).mean()はインデックス0, ... , 30を持っていることを

interval_mean.iloc[:, 3:] = interval_mean.groupby(2, as_index=False).mean().iloc[:, 2:] 

注意を設定するときにことを意味しhist_meanから、最初に(最初の20年間)それはインデックス0, ..., ~20*365を持っており、2回目はarround 20*365からカウントアップしているインデックスを持っています。

これは最初はちょっと混乱しますが、パンダはそれについて素晴らしいdocumentationを提供し、人々はすぐにそれがなぜとても有用であるかを発見します。 私は一例で何が起こるか説明してよ:

は、我々は次のようDataFrameがあるとします。

df = pd.DataFrame(np.reshape(np.random.randint(5, size=30), [-1,3])) 
df 

    0 1 2 
0 1 1 2 
1 2 1 1 
2 0 1 2 
3 0 2 0 
4 2 1 0 
5 0 1 2 
6 2 2 1 
7 1 0 2 
8 0 1 0 
9 1 2 0 

注列名が0,1,2であり、行名(インデックス)が0, ..., 9あること。

我々はgroupbyをプリフォームするとき、我々は(インデックスは2から0間だけのためのドロー番号によってグループ化された列に等しい)

df.groupby(0, as_index=False).mean() 

    0   1   2 
0 0 1.250000 1.000000 
1 1 1.000000 1.333333 
2 2 1.333333 0.666667 

を得ます。ここで、df.locに割り当てを行うときは、割り当てられたセルがあれば、そのセルが割り当て先の対応するセルに置き換えられます。それ以外の場合は、NAのままになります。

df.loc[:,:] = df.groupby(0, as_index=False).mean() 
df 

    0   1   2 
0 0.0 1.250000 1.000000 
1 1.0 1.000000 1.333333 
2 2.0 1.333333 0.666667 
3 NaN NaN  NaN 
4 NaN NaN  NaN 
5 NaN NaN  NaN 
6 NaN NaN  NaN 
7 NaN NaN  NaN 
8 NaN NaN  NaN 
9 NaN NaN  NaN 

そして、あなたはCSVファイルへNAを書くときには、セルを空白のままにします。

パズルの最後のピースがinterval_meanは、元のインデックスを保存する方法ですが、スライスは、元のインデックスを保持しているため、これは次のとおりです。

df[df[1] > 1] 

    0 1 2 
3 0 2 0 
6 2 2 1 
9 1 2 0 
+0

あなたの答えの2番目の部分は、ドキュメントの右側のセクションに私を指摘し、問題を正しく解決しました。最初の部分は必要ではありませんでした。何年もの間、私は毎年何年もの間、何年もの間、手段を欲しかったからです。投稿の最初のセクションを削除できますか?それは質問に対処していないからですか? – Neil

+0

完了。ちょうどあなたのコードは、次のものを1つのグループとみなすことに注意してください。[01-01-1974、01-02-1974、01-03-1974、...、01-12-1974、01-01-1975、... ] '(そしてそれに対して1つの行を生成する)。私はそれが「複数年の期間にわたる年の毎日」とはみなしません。 – tmrlvi

関連する問題