查找最接近 DataFrame 列平均值的行

Find a row closest to the mean of a DataFrame column

我正在 pandas 使用一个小数据集,但我被困在某个地方。

合并后的数据如下:

使用此数据,下面的代码给出了每个区域的最小面积,并在获得的 Dataframe 的同一行上完成相应的国家/地区名称。

Area_min=Africa.groupby('Region').Area.agg([min])
Area_min['Country']=(Africa.loc[Africa.groupby('Region').Area.idxmin(), 'Names']).values
Area_min

而这个给出了每个地区的最大人口数,并在获得的Dataframe中的同一行补上了相应的国家名称。

Pop_max=Africa.groupby('Region').Population.agg([max])
Pop_max['Country']=(Africa.loc[Africa.groupby('Region').Population.idxmax(), 'Names']).values
Pop_max

现在,我正在尝试获取每个地区的平均人口,并在获得的 Dataframe 的同一行上填写人口最接近相应组平均值的国家/地区的名称。

下面的代码给出了每个地区的平均人口,但我坚持与国家名称相对应。

Pop_average=Africa.groupby('Region').Population.agg(['mean'])

我正在考虑 .map() 和 .apply() 函数,但我尝试过但没有成功。任何提示都会有所帮助。

由于您只按一列分组,因此一次分组效率更高。

此外,由于您无论如何都在使用 idxmin,执行第一个 groupby.agg 似乎是多余的,因为您可以直接访问列名。

g = Africa.groupby('Region')
Area_min = Africa.loc[g['Area'].idxmin(), ['Names', 'Area']]
Pop_max = Africa.loc[g['Population'].idxmax(), ['Names', 'Population']]

那么对于你的问题,这里有一种方法。对总体mean进行变换,求均值与总体的差异,使用abs+groupby+idxmin找到差异最小的位置;然后像上面那样使用 loc 访问器来获得所需的结果:

Pop_average = Africa.loc[((g['Population'].transform('mean') - Africa['Population']).abs()
                          .groupby(Africa['Region']).idxmin()), 
                         ['Names','Population']]