如何根据DataFrame的freq列区间给group列赋值并计算分组均值
解决方法
你可以用以下两种方案实现自定义区间的group列赋值,后续再分组计算均值填充avg列即可。
方案1:使用pd.cut高效批量打标(推荐,适合区间数量多的场景)
pd.cut可以直接根据你定义的区间边界批量给数据打分类标签,不需要手写大量筛选条件:
import pandas as pd # 1. 按你的需求自定义所有区间的左右边界,示例按你给出的前两个区间填充,自行补全剩余22个区间的边界 # 注意边界要按从小到大的顺序排列 freq_bins = [0.1, 0.2, 1, 1.2] # 2. 定义每个区间对应的group值,数量比区间边界少1,此处按顺序填1到24即可 group_labels = [1, 2] # 3. 给group列赋值,include_lowest=True保证左边界的数值会被包含在对应区间内 # 不在你定义区间内的数值默认返回NaN,用fillna保留原来的0值 df['group'] = pd.cut( df['freq'], bins=freq_bins, labels=group_labels, include_lowest=True ).fillna(0).astype(int)
方案2:遍历自定义规则赋值(适合规则少、区间不规律的场景)
如果你更倾向于逐条定义区间规则,可以把规则存在列表里遍历执行,避免重复写loc代码:
# 定义所有规则,格式为(目标group值, 区间左边界, 区间右边界),补全剩余22条规则即可 group_rules = [ (1, 0.1, 0.2), (2, 1, 1.2) ] for group_val, left_bound, right_bound in group_rules: df.loc[(df['freq'] >= left_bound) & (df['freq'] <= right_bound), 'group'] = group_val
计算avg列
group列赋值完成后,用groupby + transform即可直接把分组均值填充到对应行的avg列:
df['avg'] = df.groupby('group')['pow'].transform('mean')
你可以执行print(df['group'].value_counts())验证各group的行数是否符合预期。
内容的提问来源于stack exchange,提问作者Qwerty
相关产品推荐
相关产品推荐

