2017-06-21 45 views
2

有沒有更簡單/更正確的方法來分配動態羣組? 讓我們SAQ,我們有以下DF:在熊貓羣體中的動態子羣組

group days(int, >0) 
    A  1 
    B  12 
    A  14 
    A  16 
    A  19 
    B  23 
    C  92 
    C  12 

我想指派基於以下規則分組:

if days >20 then subgroup = 4 
if days <= 20 then subgroup = 3 
if days <= 10 then subgroup = 2 
if days == 0 then subgroup = 1 

這裏是我如何做到這一點現在:

df['subgroup'] = 4 
df.loc[df['days'] >20,'subgroup'] = 4 
df.loc[df['days'] <=20,'subgroup'] = 3 
df.loc[df['days'] <=10,'subgroup'] = 2 
df.loc[df['days'] ==0,'subgroup'] = 1 
df = df.reset_index() 
df['dynamic_subgroup'] = df.groupby(['group'])['subgroup'].rank(method='dense') 

生成的表格是這一個:

group days(int, >0)  dynamic_subgroup 
    A  1     1 
    B  12     1 
    A  14     2 
    A  16     3 
    A  19     4 
    B  23     2 
    C  92     2 
    C  12     1 

我想知道是否有任何更簡單/更好的方法在熊貓中實現相同的結果?通常,對代碼的任何更正都會得到讚賞。

回答

3

可以使用cut了挑選:

bins = [-1, 0, 10, 20, np.inf] 
labels=[1,2,3,4] 
df['subgroup'] = pd.cut(df['days'], bins=bins, labels=labels) 
print (df) 
    group days subgroup 
0  A  1  2 
1  B 12  3 
2  A 14  3 
3  A 16  3 
4  A 19  3 
5  B 23  4 
6  C 92  4 
7  C 12  3 
+0

謝謝@jezrael!但是,我仍然需要使用'rank',對嗎?我只是想知道,如果我可以通過一個操作獲得這個動態組合.. – user912830823

+0

是的,那麼需要'groupby' +'rank'.If需要按密度排序的方法需要'df ['dynamic_subgroup'] = df.groupby([組 '])[' 亞組 ']。秩(方法=' 緻密')'。但是,如果只需要計數組,則需要'df ['dynamic_subgroup'] = df.groupby(['group'])。cumcount()',但輸出與「rank」不同# – jezrael

2

使用searchsorted

df.assign(subgroup=np.searchsorted([0, 10, 20], df.days.values) + 1) 

    group days subgroup 
0  A  1   2 
1  B 12   3 
2  A 14   3 
3  A 16   3 
4  A 19   3 
5  B 23   4 
6  C 92   4 
7  C 12   3 
+0

謝謝!但是,這並不指定子組1的任何條目。想法是動態子組將是1,2,3等,請參閱我的問題中的預期結果。 – user912830823