如何在Python中按id分组提取cycle为整数值的行
Pandas 按ID分组提取Cycle为整数值的行
给定包含id、cycle、Salary、Children、Days字段的Pandas数据集,需按id分组后,仅保留每个分组中cycle为整数值的行(如1、1.0、2.0这类值)。
原始数据集代码
import pandas as pd # 创建数据集 data = {'id': [1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,3, 4, 4, 4, 4,4, 5, 5, 5, 5, 5,5, 5, 5,5, 5,5, 5,5, 5, 5,5], 'cycle': [0.2,0.4, 0.6, 0.8, 1,1.2,1.4,1.6,1.8,2.0,2.2, 0.2,0.4, 0.6,0.8,1.0,1.2, 0.2,0.4, 0.6, 0.8,1.0,1.2,1.4, 0.2,0.4, 0.6, 0.8,1.0, 0.2,0.4, 0.6, 0.8, 1.0,1.2,1.4,1.6,1.8, 2.0,2.2,2.4,2.6,2.8,3.0,3.2], 'Salary': [7, 7, 7,8,9,10,11,12,13,14,15, 4, 4, 4,4,5,6, 8,9,10,11,12,13,14, 8,9,10,11,12, 7, 7,9,10,11,12,13,14,15, 9,10,11,12,13,14,15], 'Children': ['No', 'Yes', 'Yes', 'Yes', 'Yes', 'No','No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'No','Yes', 'Yes', 'No','No', 'Yes','Yes', 'Yes', 'No','Yes', 'Yes','Yes', 'No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'Yes'], 'Days': [123, 128, 66, 66, 120, 141, 52,96, 120, 141, 52, 96, 120,120, 141, 52,96, 15,123, 128, 66, 120, 141, 141, 141,123, 128, 66,67, 123, 128, 66, 123, 128, 66, 120, 141, 52, 123, 128, 66, 123, 128, 66, 120,], } # 转换为DataFrame df = pd.DataFrame(data) print("原始数据集:\n", df)
实现方法
方法1:直接布尔索引筛选(推荐,性能最优)
利用浮点数的is_integer()方法准确判断cycle是否为整数值,直接筛选符合条件的行:
# 筛选cycle为整数值的行 filtered_df = df[df['cycle'].apply(lambda x: x.is_integer())] print("筛选后数据集:\n", filtered_df)
说明
x.is_integer()会精准识别浮点数是否为整数(如1.0.is_integer()返回True,0.2.is_integer()返回False)- 无需额外分组操作即可覆盖所有
id分组的筛选需求,执行效率最高
方法2:按ID分组后筛选(满足分组操作要求)
如果必须通过分组逻辑实现,可结合groupby与apply操作:
# 按id分组,保留每组中cycle为整数值的行 filtered_df = df.groupby('id').apply(lambda group: group[group['cycle'].apply(lambda x: x.is_integer())]).reset_index(drop=True) print("筛选后数据集:\n", filtered_df)
说明
- 先按
id分组,对每个分组单独执行筛选逻辑 reset_index(drop=True)用于重置索引,避免分组后产生多级索引结构
预期结果示例
筛选后的数据集将仅包含每个id下cycle为整数值的行,例如:
- id=1保留cycle=1、2.0的行
- id=5保留cycle=1.0、2.0、3.0的行
内容的提问来源于stack exchange,提问作者NN_Developer
相关产品推荐
相关产品推荐

