根据组查找pandas数据框中的百分位数

时间:2017-10-30 01:40:59

标签: python pandas numpy

Season  Name    value
2001    arkansas    3.497
2002    arkansas    3.0935
2003    arkansas    3.3625
2015    arkansas    3.766
2001    colorado    2.21925
2002    colorado    1.4795
2010    colorado    2.89175
2011    colorado    2.48825
2012    colorado    2.08475
2013    colorado    1.68125
2014    colorado    2.5555
2015    colorado    2.48825

在上面的数据框中,我想确定每个州(阿肯色州和科罗拉多州)的value列中的最高和最低10百分位值。我怎么做?我可以识别整个value列的顶部和底部百分位数,如下所示:

np.searchsorted(np.percentile(a, [10, 90]), a))

2 个答案:

答案 0 :(得分:1)

您可以使用groupby + quantile

df.groupby('Name')['value'].quantile([.1, .9])

Name
arkansas  0.1    3.174200
          0.9    3.685300
colorado  0.1    1.620725
          0.9    2.656375
Name: value, dtype: float64

然后拨打np.searchsorted

或者,使用qcut

df.groupby('Name').apply(lambda x: 
       pd.qcut(x['value'], [.1, .9]))

Name
arkansas  0     (3.173, 3.685]
          1                NaN
          2     (3.173, 3.685]
          3                NaN
colorado  4      (1.62, 2.656]
          5                NaN
          6                NaN
          7      (1.62, 2.656]
          8      (1.62, 2.656]
          9      (1.62, 2.656]
          10     (1.62, 2.656]
          11     (1.62, 2.656]
Name: value, dtype: object

答案 1 :(得分:0)

如果您的数据框的变量是df,这应该可行。我不确定你想要的输出是什么样的,但我只是为字典创建了代码,其中每个键都是一个状态。此外,由于您的值很少,我使用选项"最近的"用于参数插值(默认值为插值)。要查看可能的选项,请查看函数here的文档。

import pandas as pd
import numpy as np
df = pd.read_csv('stacktest.csv')
#array of unique state names from the dataframe
states = np.unique(df['Name'])
#empty dictionary 
state_data = dict()
for state in states:
    state_data[state] = np.percentile(df[df['Name'] == state]['value'],[10,90],interpolation = 'nearest')
print(state_data)

enter image description here