[英]Finding the percentile in pandas column
数据-
df=pd.DataFrame({'city':['abc','abc','abc','abc','abc','abc'],'zone':['AA','AA','CC','CC','DD','DD'],'date':['1/1/2020','1/2/2020','1/1/2020','1/2/2020','1/1/2020','1/2/2020'],'D':[22,33,32,76,44,66]})
现在我想搜索一个特定的城市和日期并找到列“D”的 10%,如果特定区域低于它,则将该行添加到数据报中。
例如-
对于第一个city
“abc”和date
2020 年 1 月 1 日,我们有三个区域“AA”、“CC”和“DD”,对应的“D”列分别为 22,32 和 44。所以第 10 个百分位数是 24所以第一行被附加到新的 dataframe 等等。
IIUC 您可以定义唯一城市和日期的列表并创建一个空的 dataframe ( new_df
)。 然后简单地遍历 city 、 dates
和cities
第 10 个百分位行到new_df
:
cities = list(df.city.unique())
dates = list(df.date.unique())
new_df = pd.DataFrame()
for city in cities:
for date in dates:
d = df[(df.city==city) & (df.date==date)]
mx = d.D.max()
mn = d.D.min()
v = mn + (mx-mn)/10
new_df = new_df.append(d[d.D<=v])
new_df
city zone date D
0 abc AA 1/1/2020 22
1 abc AA 1/2/2020 33
IIUC,这是groupby().quantile
:
df.groupby(['city','zone'])['D'].quantile(0.1)
Output:
city zone
abc AA 23.1
CC 36.4
DD 46.2
Name: D, dtype: float64
您可以将groupby.transform
与quantile
一起使用,这将按行给出组的第 10 个百分位数,然后使用loc
仅获取 D 中的值小于或等于( le
)此第 10 个百分位数值的行。
print (df.loc[df['D'].le(df.groupby(['city', 'date'])['D']
.transform(lambda x: x.quantile(0.1))), :])
city zone date D
0 abc AA 1/1/2020 22
1 abc AA 1/2/2020 33
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.