2017-06-21 58 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