如何用Pandas按城市分组筛选5%-95%百分位的包裹重量数据
解决方案
要实现按城市分组,保留重量处于5%到95%百分位之间的数据,你可以用Pandas的groupby结合transform方法来实现类似SQL窗口函数的逻辑,具体操作如下:
步骤1:计算每个城市的分位数阈值
通过按城市分组,用transform方法为每一行匹配其所在城市的5%和95%分位数,将结果作为新列存入原数据框,方便后续筛选。
步骤2:筛选符合条件的数据
基于生成的分位数列,筛选出weight大于5%分位数且小于95%分位数的行。
完整代码示例
import pandas as pd # 原始数据集 df = pd.DataFrame({ 'city': ['LA', 'Berlin', 'Hamburg', 'LA', 'Berlin', 'Hamburg', 'Tokyo', 'Hamburg', 'Berlin', 'Hamburg', 'Hamburg', 'Hamburg', 'Berlin', 'Hamburg', 'Berlin', 'Tokyo', 'Tokyo', 'Tokyo'], 'weight': [930,933,1577,1018,547,981,1672,598,995,1164,601,1429,1349,1000,618,539,880,1472] }) # 为每行匹配所在城市的5%、95%分位数 df['q5'] = df.groupby('city')['weight'].transform(lambda x: x.quantile(0.05)) df['q95'] = df.groupby('city')['weight'].transform(lambda x: x.quantile(0.95)) # 筛选数据并移除临时列 filtered_df = df[(df['weight'] > df['q5']) & (df['weight'] < df['q95'])].drop(columns=['q5', 'q95']) print(filtered_df)
代码说明
groupby('city')['weight'].transform():对每个城市的重量列独立计算分位数,返回与原数据长度一致的结果,确保每行对应自身城市的阈值。x.quantile(0.05)/x.quantile(0.95):分别计算5%和95%分位数,可根据需求调整分位数数值。- 最后通过布尔索引筛选目标数据,删除临时生成的分位数列得到最终结果。
内容的提问来源于stack exchange,提问作者bluekit46
相关产品推荐
相关产品推荐

