在Pandas中为阈值下连续值及非阈值行分配唯一分组
Pandas DataFrame添加自定义分组列问题
原始数据
现有如下Pandas DataFrame:
Groups Names Values G1 SP1 1 G1 SP1 5 G1 SP1 -2 G1 SP1 30 G1 SP1 50 G1 SP1 50 G1 SP1 -1 G1 SP1 2 G1 SP2 2 G1 SP2 20 G1 SP2 1 G2 SP3 30 G2 SP3 9 G2 SP3 3 G3 SP3 2
需求说明
需要添加new_group列,规则如下:
- 遍历整个DataFrame,连续满足
Values < 10的行分配同一唯一分组标识 - 不满足
Values < 10的每行单独分配一个唯一分组标识
预期结果
处理后的DataFrame如下:
Groups Names Values new_groups G1 SP1 1 NG1 G1 SP1 5 NG1 G1 SP1 -2 NG1 G1 SP1 30 NG2 G1 SP1 50 NG3 G1 SP1 50 NG4 G1 SP1 -1 NG5 G1 SP1 2 NG5 G1 SP2 2 NG5 G1 SP2 20 NG6 G1 SP2 1 NG7 G2 SP3 30 NG8 G2 SP3 9 NG9 G2 SP3 3 NG9 G3 SP3 2 NG10
示例说明:前3行连续满足Values < 10,分配分组NG1;第4行值>10,单独分配NG2;第5行值>10,单独分配NG3,以此类推。
数据字典格式
附该DataFrame的字典格式:
{'Groups': {0: 'G1', 1: 'G1', 2: 'G1', 3: 'G1', 4: 'G1', 5: 'G1', 6: 'G1', 7: 'G1', 8: 'G1', 9: 'G1', 10: 'G1', 11: 'G2', 12: 'G2', 13: 'G2',14:'G3'}, 'Names': {0: 'SP1', 1: 'SP1', 2: 'SP1', 3: 'SP1', 4: 'SP1', 5: 'SP1', 6: 'SP1', 7: 'SP1', 8: 'SP2', 9: 'SP2', 10: 'SP2', 11: 'SP3', 12: 'SP3', 13: 'SP3', 14 : 'SP3'}, 'Values': {0: 1, 1: 5, 2: -2, 3: 30, 4: 50, 5: 50, 6: -1, 7: 2, 8: 2, 9: 20, 10: 1, 11: 30, 12: 9, 13: 3, 14: 2}}
解决方案
可以通过以下步骤实现:
- 标记每行是否满足
Values < 10 - 生成分组标识:不满足条件的行单独分组,连续满足条件的行归为同一组
- 将分组标识格式化为
NG+数字的形式
具体代码如下:
import pandas as pd # 加载数据 data = {'Groups': {0: 'G1', 1: 'G1', 2: 'G1', 3: 'G1', 4: 'G1', 5: 'G1', 6: 'G1', 7: 'G1', 8: 'G1', 9: 'G1', 10: 'G1', 11: 'G2', 12: 'G2', 13: 'G2',14:'G3'}, 'Names': {0: 'SP1', 1: 'SP1', 2: 'SP1', 3: 'SP1', 4: 'SP1', 5: 'SP1', 6: 'SP1', 7: 'SP1', 8: 'SP2', 9: 'SP2', 10: 'SP2', 11: 'SP3', 12: 'SP3', 13: 'SP3', 14 : 'SP3'}, 'Values': {0: 1, 1: 5, 2: -2, 3: 30, 4: 50, 5: 50, 6: -1, 7: 2, 8: 2, 9: 20, 10: 1, 11: 30, 12: 9, 13: 3, 14: 2}} df = pd.DataFrame(data) # 标记是否满足条件 df['is_small'] = df['Values'] < 10 # 生成分组ID:不满足条件的行单独分组,连续满足条件的行归为一组 df['group_id'] = ( (~df['is_small']) | (df['is_small'] & ~df['is_small'].shift(fill_value=False)) ).cumsum() # 格式化为NG+数字的形式 df['new_groups'] = 'NG' + df['group_id'].astype(str) # 移除中间辅助列(可选) df = df.drop(['is_small', 'group_id'], axis=1) print(df)
运行代码后即可得到预期结果。
内容的提问来源于stack exchange,提问作者chippycentra
相关产品推荐
相关产品推荐

