首页 > 解决方案 > 根据第 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)

我如何实现这一目标?

标签: pythonpandas

解决方案


希望这可以帮助:

  1. 计算第 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}}
  1. 比较值计数和百分位数:
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 值,但不会影响性能。


推荐阅读