私は個々のカウントを持つ多くのデータフレームを持っています(例えばdf_boston
以下)。各行は、その行marker
とそのによって一意に識別されるデータポイントを定義しますpoint
。df_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]
コメントを追加