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