python - 根据第 90 个百分位数内的值过滤掉数据框
问题描述
假设我有这个数据框
d = {'fruit': ['apple', 'apple', 'apple', 'orange'], 'names': ['bob', 'bob', 'bob', 'joe']}
df = pd.DataFrame(data=d)
现在我想遍历每一列并过滤掉低百分位数,只保留第 90 个百分位数中包含的值。
因此,因为apple
并且bob
每个都在其相关的第 90 个百分位数内,所以我将拥有这个数据框
d = {'fruit': ['apple', 'apple', 'apple'], 'names': ['bob', 'bob', 'bob']}
df = pd.DataFrame(data=d)
我如何实现这一目标?
解决方案
希望这可以帮助:
- 计算第 90 个百分位数并将它们保存在字典中:
perc_dic = df.apply(lambda x : np.percentile(x.value_counts().tolist(), 90) , axis= 0).to_dict()
perc_dic
{'fruit': 2.8, 'names': 2.8}
2.计算每个值的值计数:
value_dic = df.apply(lambda x : x.value_counts() , axis= 0).to_dict()
value_dic
{'fruit': {'apple': 3.0, 'bob': nan, 'joe': nan, 'orange': 1.0},
'names': {'apple': nan, 'bob': 3.0, 'joe': 1.0, 'orange': nan}}
- 比较值计数和百分位数:
df_result = df.apply(lambda row : row if value_dic['fruit'][row['fruit']] >= perc_dic['fruit'] and
value_dic['names'][row['names']] >= perc_dic['names']
else np.nan , axis= 1)
df_result.dropna()
fruit names
0 apple bob
1 apple bob
2 apple bob
注意: value_dic 中有一些 nan 值,但不会影响性能。
推荐阅读
- c++ - 如何克服屏幕外和屏幕上帧缓冲区渲染之间的差异?
- c++ - 如何使用 Eclipse IDE 清屏
- typescript - 打字稿:import * as moment from 'moment' vs. import moment from 'moment'
- r - 如何在 Windows 上从 R 运行 .sh 脚本?
- excel - 如何使用 .Union 在 .SpecialCells 方法中使用 2 个“类型”参数
- mysql - AWS-RDS 最大允许数据包值无法更改
- shiny - 对反应事件的数据操作
- python - y 与 Altair 的双轴
- ruby-on-rails - Rails / Ruby如何始终显示小数精度
- android - 在我的手机上运行我的 android studio 应用程序时,它会运行但不会将其保存在我的手机上