首页 > 解决方案 > Pandas 按列分组以生成分位数 (.25, 0.5, .75)

问题描述

假设我们有CityName, Min-Temperature, Max-Temperature, Humidity不同的城市。

我们需要一个分组的输出数据框CityName并希望生0.25, 0.5 and 0.75成分位数。新的列名将是OldColunmName + ('Q1)/('Q2')/('Q3').

示例输入

df = pd.DataFrame({'cityName': pd.Categorical(['a','a','a','a','b','b','b','b','a','a','a','a','b','b','b','b']),
                   'MinTemp': [1.1, 2.1, 3.1, 1.1, 2, 2.1, 2.2, 2.4, 2.5, 1.11, 1.31, 2.1, 1, 2, 2.3,  2.1],
                   'MaxTemp': [2.1, 4.2, 5.1, 2.13, 4, 3.1, 5.2, 3.4, 3.5, 2.11, 2.31, 3.1, 2,  4.3, 4.3, 3.1],
                   'Humidity': [0.29, 0.19, .45, 0.1, 0.1, 0.1, 0.2,  0.5, 0.11, 0.31, 0.1, .1, .2, 0.3, 0.3, 0.1]
                  })

在此处输入图像描述

输出

在此处输入图像描述

标签: pythonpandas

解决方案


第一种方法

首先,您必须将数据分组到您想要的列上,即'cityName'. 然后,因为你想在每一列上进行多种不同类型的聚合,你可以使用'agg'function. 对于 中的函数'agg',您不能提供参数,因此您将它们定义如下:

def quantile_50(x):
    return x.quantile(0.5)

def quantile_25(x):
    return x.quantile(0.25)

def quantile_75(x):
    return x.quantile(0.75)

quantile_df = df.groupby('cityName').agg([quantile_25, quantile_50, quantile_75])
quantile_df

第二种方法

您可以使用describe方法并选择您需要的统计数据。通过使用idx,您可以选择要选择的子索引。

idx = pd.IndexSlice
df.groupby('cityName').describe().loc[:, idx[:, ['25%', '50%', '75%']]]


推荐阅读