您可以使用以下方法仅创建包含相关行的新df:
newdf = df[df['cluster'].isin([1,2)]
newdf.mean(axis=1)
newdf["page"].mean(axis=1)
如果您想在Cluster为1或2时仅取平均值,那么其他答案已经解决了您的问题。 如果您想针对每个Cluster值分别取平均值,则可以使用pandas的聚合函数,包括groupby
和agg
:
df.groupby("Cluster").mean()
这是最简单的方法,它将获取所有列的平均值,按簇分组。
df.groupby("Cluster").agg({"duration" : np.mean})
np.min
,np.max
,np.median
等。
groupby
方法生成一个GroupBy
对象,它类似于但不像DataFrame
。将其视为分组的DataFrame
,等待对其应用聚合操作。 GroupBy
对象具有简单的内置聚合函数,适用于所有列(第一个示例中的mean()
),还具有更通用的聚合函数(第二个示例中的agg()
),您可以使用它以各种方式应用特定函数。其中一种使用方式是传递键入函数的列名称的dict
,因此可以将特定函数应用于特定列。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()
首先选择感兴趣的行,然后求平均值,最后选择感兴趣的列。
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
值的每组值进行平均。
axis=0
取平均值,不是1,对吧? - evan54.mean
计算了列再选择它。 - evan54axis=0
,否则会出现ValueError: No axis named 1 for object type <class 'pandas.core.series.Series'>
的错误。所以在仔细检查后,我修改了答案。 - Mario