2016-08-22 13 views
1

私の仕事を達成するための方法が整いません。私は3列のデータフレームを持っています:length, reachcode, and year3列のデータを使用してパンダのデータフレームを操作する

私の例のデータフレーム:

year reachcode length 
1988 1000  1.2 
1988 1000  2.0 
1990 1000  0.3 
1993 1000  0.5 

私はその年の「長さ」を単一年以内に「reachcode」重複するものを見つけ、その後、合計しようとしています。

その後、私は「長さ」の合計値と同じ「到達コード」を異なる年に比較し、最小値を維持したいと考えています。

したがって、データフレームの例では、長さ1.2と2.0が1998年とreachcode = 1000の合計となり、その値(3.2)が1990と1993と比較され、値0.3とreachcodeが新しいリスト。

私はパンダにいくつかの経験がありますが、これはこれまで対処していたよりも複雑な作業です。私の実際のデータフレームは約40,000行なので、これを自動化する方法を見つけることは非常に役に立ちます。助けてくれてありがとう。

答えて

2

ダブルステージgroupbyが必要です。まずyearreachcodeをGROUPBYと合計を計算、あなたはlengthの分を取るために、さらにreachcodeをGROUPBYことができるようにインデックスをリセット:

df.groupby(['year', 'reachcode']).sum().reset_index().groupby('reachcode')['length'].min() 

# reachcode 
#  1000 0.3 
# Name: length, dtype: float64 
+1

をありがとうございました!最近私はグループバイを多く使いましたが、あなたが私に見せてくれたように私は二段階でそれをすることができなかったことは決してありませんでした。心から感謝する! – gball

2

は単にgroupby集計実行:

df['lengthsum'] = df.groupby(['year', 'reachcode'])['length'].transform(sum) 

df['lengthmin'] = df.groupby(['reachcode'])['lengthsum'].transform(min) 

# year reachcode length lengthsum lengthmin 
# 0 1988  1000  1.2  3.2  0.3 
# 1 1988  1000  2.0  3.2  0.3 
# 2 1990  1000  0.3  0.3  0.3 
# 3 1993  1000  0.5  0.5  0.3 
+0

それは素晴らしいです。変換関数は非常に便利です。ありがとう – gball

関連する問題