如何使用Pandas筛选首次测量体重处于指定区间的用户
解决方法:保留首次测量体重符合区间的用户
我明白你的需求啦——你需要筛选出那些首次测量(最小day_n对应的记录)体重落在指定区间内的用户,并且保留这些用户的所有测量记录对吧?咱们可以通过以下几步实现:
核心思路
- 先找出每个用户的首次测量记录(即该用户
day_n最小的那条数据) - 从这些首次记录里筛选出体重在
min_weight到max_weight之间的用户ID - 用筛选后的用户ID列表,去过滤原数据集,只保留这些用户的所有记录
修改后的完整代码
结合你已有的代码,我把筛选步骤加进去了,你可以直接参考:
import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.read_csv('../datasets/measurements_2019-12-31_2021-07-01.csv') # 体重过滤(最小、最大值) df = df[df['weight'] > 25] df = df[df['weight'] < 300] # 天数过滤(最小、最大值) df = df[df['day_n'] > -7] df = df[df['day_n'] < 187] # 仅保留测量记录数>3的用户 df = df.groupby('user_id').filter(lambda x: len(x) > 3) # ------------------- 新增的筛选步骤 ------------------- # 1. 定义你需要的体重区间 min_weight = 70 max_weight = 75 # 2. 获取每个用户首次测量(day_n最小)的记录的索引 first_measure_idx = df.groupby('user_id')['day_n'].idxmin() first_measures = df.loc[first_measure_idx] # 3. 筛选出首次测量体重符合区间的用户ID valid_user_ids = first_measures[ (first_measures['weight'] >= min_weight) & (first_measures['weight'] <= max_weight) ]['user_id'].tolist() # 4. 只保留这些有效用户的所有记录 df = df[df['user_id'].isin(valid_user_ids)] # ----------------------------------------------------- # 绘制散点图 plt.scatter(df['day_n'], df['weight']) # 绘制回归线 m, b = np.polyfit(df['day_n'], df['weight'], 1) plt.plot(df['day_n'], m*df['day_n']+b, color='red') plt.show()
代码解释
df.groupby('user_id')['day_n'].idxmin():这一步会找到每个用户组里day_n最小的那条记录的行索引,确保我们拿到的是每个用户的首次测量数据first_measures就是所有用户的首次测量记录集合,我们在这里筛选体重符合要求的用户ID- 最后用
isin(valid_user_ids)过滤原数据集,只保留这些用户的所有测量记录,完全符合你的需求
用你给出的示例数据测试的话,user_id 1的首次测量体重是72(在70-75之间)会被保留,user_id 2的首次测量体重是76(超出区间)会被排除,完美匹配你的预期~
内容的提问来源于stack exchange,提问作者Jasper
相关产品推荐
相关产品推荐

