Pandas针对特定列的平均值

4
我有一个类似这样的pandas数据框:

enter image description here

如果Cluster==1或CLuster==2,我如何计算特定列的平均值(最小值/最大值,中位数)?

谢谢!

4个回答

5

您可以使用以下方法仅创建包含相关行的新df:

newdf = df[df['cluster'].isin([1,2)]

newdf.mean(axis=1)

为了计算特定列的平均值,您可以执行以下操作:
newdf["page"].mean(axis=1) 

我觉得你需要沿着axis=0取平均值,不是1,对吧? - evan54
1
没关系,你是对的,我以为你先用.mean计算了列再选择它。 - evan54
@evan54,你是对的,实际上在计算特定列时应该使用 axis=0,否则会出现 ValueError: No axis named 1 for object type <class 'pandas.core.series.Series'> 的错误。所以在仔细检查后,我修改了答案。 - Mario

4

如果您想在Cluster为1或2时仅取平均值,那么其他答案已经解决了您的问题。 如果您想针对每个Cluster值分别取平均值,则可以使用pandas的聚合函数,包括groupbyagg

df.groupby("Cluster").mean()

这是最简单的方法,它将获取所有列的平均值,按簇分组。

df.groupby("Cluster").agg({"duration" : np.mean}) 

这是一个例子,其中您正在获取按簇分组的特定列的平均值。您还可以使用np.minnp.maxnp.median等。 groupby方法生成一个GroupBy对象,它类似于但不像DataFrame。将其视为分组的DataFrame,等待对其应用聚合操作。 GroupBy对象具有简单的内置聚合函数,适用于所有列(第一个示例中的mean()),还具有更通用的聚合函数(第二个示例中的agg()),您可以使用它以各种方式应用特定函数。其中一种使用方式是传递键入函数的列名称的dict,因此可以将特定函数应用于特定列。

1
你可以使用一行代码来实现,使用布尔索引。例如,你可以这样做:
import numpy as np
import pandas as pd

# This will just produce an example DataFrame
df = pd.DataFrame({'a':np.arange(30), 'Cluster':np.ones(30,dtype=np.int)})
df.loc[10:19, "Cluster"] *= 2
df.loc[20:,   "Cluster"] *= 3

# This line is all you need
df.loc[(df['Cluster']==1)|(df['Cluster']==2), 'a'].mean()

布尔索引数组对于正确的群集为True。a只是要计算平均值的列的名称。

0

简单直观的答案

首先选择感兴趣的行,然后求平均值,最后选择感兴趣的列。

clusters_of_interest = [1, 2]
columns_of_interest = ['page']

# rows of interest
newdf = df[ df.CLUSTER.isin(clusters_of_interest) ]
# average and pick columns of interest
newdf.mean(axis=0)[ columns_of_interest ] 

更高级的

# Create groups object according to the value in the 'cluster' column
grp = df.groupby('CLUSTER')
# apply functions of interest to all cluster groupings
data_agg = grp.agg( ['mean' , 'max' , 'min' ] )

这也是一篇好的链接,介绍了聚合技术。需要注意的是,“简单答案”会对簇1和2(或在clusters_of_interest中指定的其他簇)进行平均,而.agg函数会对具有相同CLUSTER值的每组值进行平均。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接