カスタム(および場合によっては重複する)ビンに基づいて、要約データフレーム内の個々のパンダデータフレームからのデータポイントを合計します

マーク

私は個々のカウントを持つ多くのデータフレームを持っています(例えばdf_boston以下)。各行は、その行markerとそのによって一意に識別されるデータポイントを定義しますpointdf_inventory_masterカスタムビンを持つサマリーデータフレーム()があります(上記pointのsはマスターのBegin-End座標にマップされます)。このデータフレームに、個々の都市のカウントを合計する列を新しい列に追加したいと思います。例を示します。

2つの癖は、マスターフレームのビンがオーバーラップする可能性があること(カウントを両方に追加する必要がある)と、一部のカウントがマスターに含まれない可能性があること(カウントは無視する必要がある)です。

これは純粋なPythonで実行できますが、データはデータフレーム内にあるため、で操作を実行すると便利で、おそらく高速になりますpandasここでヒントをいただければ幸いです。

これはマスターフレームです:

>>> df_inventory_master = pd.DataFrame({'Marker': [1, 1, 1, 2],
...                                     'Begin': [100, 300, 500, 100],
...                                     'End': [200, 600, 900, 250]})
>>> df_inventory_master
   Begin  End  Marker
0    100  200       1
1    300  600       1
2    500  900       1
3    100  250       2

これは1つの都市のデータです。

>>> df_boston = pd.DataFrame({'Marker': [1, 1, 1, 1],
...                           'Point': [140, 180, 250, 500],
...                           'Count': [14, 600, 1000, 700]})
>>> df_boston
   Count  Marker  Point
0     14       1    140
1    600       1    180
2   1000       1    250
3    700       1    500

これが望ましい出力です。
-700のカウント(マーカー1、ポイント500)は2つのマスタービンに分類され、両方でカウントされることに注意してください。
-1000のカウント(マーカー1、ポイント250)はマスタービンに含まれず、カウントされないことに注意してください。
-df_bostonマーカー2のデータがないため、マーカー2にマップされるものはないことに注意してください

>>> desired_frame
   Begin  End  Marker  boston
0    100  200       1     614
1    300  600       1     700
2    500  900       1     700
3    100  250       2       0

私が試したこと:pd.cut()関数を調べましたが、ビンの性質が重複しており、場合によっては存在しないため、これは適合しないようです。0の値で満たされた列を追加して、その途中の一部を取得できますが、マスターで定義されたビンを使用して、各フレームのデータを合計する方法を見つける必要があります。

>>> df_inventory_master['boston'] = pd.Series([0 for x in range(len(df_inventory_master.index))], index=df_inventory_master.index)
>>> df_inventory_master
   Begin  End  Marker  boston
0    100  200       1       0
1    300  600       1       0
2    500  900       1       0
3    100  250       2       0
最も厚い

これが私がそれにアプローチした方法です、基本的にはパンダのマージ操作を使用して* sqlスタイルの左結合*し、次に行軸全体にapply()を適用し、ラムダを使用して個々のレコードがバンド内にあるかどうかを判断し、最後にgroupbyとsum :

df_merged = df_inventory_master.merge(df_boston, on=['Marker'],how='left')

# logical overwrite of count
df_merged['Count'] = df_merged.apply(lambda x: x['Count'] if x['Begin'] <= x['Point'] <= x['End'] else 0 , axis=1 )
df_agged = df_merged[['Begin','End','Marker','Count']].groupby(['Begin','End','Marker']).sum()
df_agged_resorted = df_agged.sort_index(level = ['Marker','Begin','End'])
df_agged_resorted = df_agged_resorted.astype(np.int) 
df_agged_resorted.columns =['boston'] # rename the count column to boston.
print df_agged_resorted

そしてその結果は

                  boston
Begin End Marker        
100   200 1          614
300   600 1          700
500   900 1          700
100   250 2            0

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ