2016-07-04 247 views
0

Cumsum直到值超過一定數目:cumsum大熊貓高達特定的值 - 蟒蛇大熊貓

說,我們有兩個數據幀A,B,看起來像這樣:

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]}) 

兩個數據幀將看起來像這樣。

>>> 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 

對於每個組在數據幀中的「類型」,我想加入B中的列的值高達在A中的列的值指定的數量我還要計數的數目B中添加的行。我一直在試圖用一個cumsum(),但我不知道到底要停止總和達到該值時,

輸出應該是:

type value 
0 a  3 
1 b  2 
2 c  4 

謝謝

回答

1

合併這兩個數據幀之前手應該有所幫助:

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在數據幀B中只有一行的值爲100,並且該值超過了數據幀A中指示的值,例如80。在數據框B中消除這個d。有沒有辦法解決這個問題? – dleal

+0

該解決方案也適用於該情況。 shift函數不會消除該行,而是將零加到它看到'fillna(0)',因此它將包含該行。 – Psidom

0

假設B['type']進行排序與​​樣本的情況下,這裏有一個基於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