【发布时间】:2016-09-04 22:28:01
【问题描述】:
【问题讨论】:
【问题讨论】:
您可以使用以下方法创建仅包含相关行的新 df:
newdf = df[df['cluster'].isin([1,2)]
newdf.mean(axis=1)
为了计算特定列的平均值,您可以:
newdf["page"].mean(axis=1)
【讨论】:
axis=0 而不是 1,不是吗?
.mean 然后再选择列
axis=0 否则您会得到 ValueError: No axis named 1 for object type <class 'pandas.core.series.Series'> 所以在仔细检查后我编辑了答案。
如果您的意思是仅在 Cluster 为 1 或 2 时取平均值,那么此处的其他答案可以解决您的问题。如果你的意思是对 Cluster 的每个值取一个单独的平均值,你可以使用 pandas 的聚合函数,包括 groupyby 和 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 的列名键控到函数,因此可以将特定的函数应用于特定的列。
【讨论】:
您可以使用boolean indexing 在一行中完成。例如,您可以执行以下操作:
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 只是计算平均值的列的名称。
【讨论】:
首先选择感兴趣的行,然后平均然后选择感兴趣的列。
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' ] )
这也是一个很好的link,它描述了聚合技术。应该注意的是,“简单答案”对集群 1 和 2 或 clusters_of_interest 中指定的任何内容进行平均,而 .agg 函数对具有相同 CLUSTER 值的每组值进行平均。
【讨论】: