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))
答案 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)