2016-07-04 8 views
0

CUMSUM値が一定数を超えるまで:CUMSUMパンダ - Pythonのパンダ

A = pd.DataFrame({"type":['a','b','c'], "value":[100, 50, 30]}) 
B = pd.DataFrame({"type": ['a','a','a','a','b','b','b','c','c','c','c','c'], "value": [10,50,45,10,45,10,5,6,6,8,12,10]}) 

2つのデータフレームになります。

は、我々は2つのデータは次のようになり、Bフレーム持っていると言いますこのように見える。各群について

>>> A 
    type value 
0 a 100 
1 b  50 
2 c  30 

>>> B 
    type value 
0  a  10 
1  a  50 
2  a  45 
3  a  10 
4  b  45 
5  b  10 
6  b  5 
7  c  6 
8  c  6 
9  c  8 
10 c  12 
11 c  10 

データフレームAの「タイプ」で、私はまた、数をカウントしたいA.内の列値で指定された数までのBの列値を追加したいです追加されたBの行。

を出力する必要があり、私はCUMSUM()を使用しようとしてきたが、値に達したとき、私は合計を停止するために、正確に知らない:

type value 
0 a  3 
1 b  2 
2 c  4 

ありがとう、

手が助けなければならない前に

答えて

1

2つのデータフレームをマージ:

B['type']を想定し
import pandas as pd 
df = pd.merge(B, A, on = 'type') 
df['cumsum'] = df.groupby('type')['value_x'].cumsum() 
B[(df.groupby('type')['cumsum'].shift().fillna(0) < df['value_y'])].groupby('type').count() 

# type value 
# a  3 
# b  2 
# c  4 
+0

ありがとう、私の目的のためにこれはかなりうまくいきます。私の唯一の反対は次のようになります:新しいタイプdは値100のデータフレームBに1行だけを持ち、この値はデータフレームAに示された値、たとえば80を超えているとします。この問題を解決する方法はありますか? – dleal

+0

この解決策もその場合に有効です。 shift関数は行を削除するのではなく、 'fillna(0)'を参照するためにゼロを追加するので、行がインクルードされます。 – Psidom

0

はサンプルの場合と同様にソートされて、ここでnumpyのベースのソリューションです -

IDs = np.searchsorted(A['type'],B['type']) 
count_cumsum = np.bincount(IDs,B['value']).cumsum() 
upper_bound = A['value'] + np.append(0,count_cumsum[:-1]) 
Bv_cumsum = np.cumsum(B['value']) 
grp_start = np.unique(IDs,return_index=True)[1] 
A['output'] = np.searchsorted(Bv_cumsum,upper_bound) - grp_start + 1