繁体   English   中英

在 pandas 列中查找百分位数

[英]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 、 datescities第 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.transformquantile一起使用,这将按行给出组的第 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM