查找给定列的百分位数统计数据

问题描述 投票:0回答:6

我有一个

pandas
数据框
my_df
,我可以在其中找到给定列的平均值(),中位数(),模式():

my_df['field_A'].mean()
my_df['field_A'].median()
my_df['field_A'].mode()

我想知道是否可以找到更详细的统计数据,例如第 90 个百分位数?

python pandas statistics quantile percentile
6个回答
172
投票
  • 您可以使用
    pandas.DataFrame.quantile()
    功能。
    • 如果您查看
      quantile()
      的 API,您会发现它需要一个关于如何进行插值的参数。如果您想要位于数据中两个位置之间的分位数:
      • “线性”、“较低”、“较高”、“中点”或“最近”。
      • 默认情况下,它执行线性插值。
      • 这些插值方法在维基百科文章 percentile
      • 中进行了讨论
import pandas as pd
import numpy as np

# sample data 
np.random.seed(2023)  # for reproducibility
data = {'Category': np.random.choice(['hot', 'cold'], size=(10,)),
        'field_A': np.random.randint(0, 100, size=(10,)),
        'field_B': np.random.randint(0, 100, size=(10,))}
df = pd.DataFrame(data)

df.field_A.mean()  # Same as df['field_A'].mean()
# 51.1

df.field_A.median() 
# 50.0

# You can call `quantile(i)` to get the i'th quantile,
# where `i` should be a fractional number.

df.field_A.quantile(0.1)  # 10th percentile
# 15.6

df.field_A.quantile(0.5)  # same as median
# 50.0

df.field_A.quantile(0.9)  # 90th percentile
# 88.8

df.groupby('Category').field_A.quantile(0.1)
#Category
#cold    28.8
#hot      8.6
#Name: field_A, dtype: float64

df

  Category  field_A  field_B
0     cold       96       58
1     cold       22       28
2      hot       17       81
3     cold       53       71
4     cold       47       63
5      hot       77       48
6     cold       39       32
7      hot       69       29
8      hot       88       49
9      hot        3       49

39
投票

假设系列

s

s = pd.Series(np.arange(100))

获取

[.1, .2, .3, .4, .5, .6, .7, .8, .9]

的分位数
s.quantile(np.linspace(.1, 1, 9, 0))

0.1     9.9
0.2    19.8
0.3    29.7
0.4    39.6
0.5    49.5
0.6    59.4
0.7    69.3
0.8    79.2
0.9    89.1
dtype: float64

s.quantile(np.linspace(.1, 1, 9, 0), 'lower')

0.1     9
0.2    19
0.3    29
0.4    39
0.5    49
0.6    59
0.7    69
0.8    79
0.9    89
dtype: int32

17
投票

我发现下面的方法可行:

my_df.dropna().quantile([0.0, .9])

14
投票

您甚至可以为多个列提供空值并获取多个分位数值(我使用 95 百分位数进行异常值处理)

my_df[['field_A','field_B']].dropna().quantile([0.0, .5, .90, .95])

7
投票

一个非常简单有效的方法是在特定列上调用描述函数

df['field_A'].describe()

这将为您提供平均值、最大值、中位数和第 75 个百分位数


6
投票

描述会给你四分位数,如果你想要百分位数,你可以做类似的事情

 df['YOUR_COLUMN_HERE'].describe(percentiles=[.1, .2, .3, .4, .5, .6 , .7, .8, .9, 1])
© www.soinside.com 2019 - 2024. All rights reserved.