Python 熊猫组内的动态子分组

Python 熊猫组内的动态子分组,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,是否有更简单/更正确的方法来分配动态组? 让我们看看我们有以下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

是否有更简单/更正确的方法来分配动态组? 让我们看看我们有以下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
我想知道是否有更简单/更好的方法在熊猫身上达到同样的效果?通常,对代码的任何更正都是值得赞赏的。

您可以使用以下方法进行装箱:

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


谢谢但这不会将子组1分配给组A的任何条目。其想法是动态子组将为1、2、3等,请参见我问题中的预期结果。谢谢@jezrael!但是我仍然需要使用
rank
,对吗?我只是想知道我是否可以通过一个简单的操作获得这个动态组。是的,然后需要
groupby
+
rank
。如果需要按方法密集排列,则需要
df['dynamic_subgroup']=df.groupby(['group'])['subgroup'].rank(方法密集)
。但如果只需要计数组,则需要
df['dynamic_subgroup']=df.groupby(['group']).cumcount()
,但输出不同于
rank
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
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
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