Pandas按优先级分组求有效数据的平均工单打开时长
解决方法
有两种可行方案,优先推荐第一种:
方案一:将无效值转为NaN(推荐)
直接把"No Data"替换成pandas的缺失值np.nan,同时将列转换为数值类型,这样分组计算均值时会自动忽略缺失值,正好符合需求:
import pandas as pd import numpy as np # 原始数据 df = { 'inc_priority2':['Critical','Critical','Critical','High','High','High','Medium','Medium','Low'], 'inc_open_minutes':['No Data',10,6, 'No Data',4,2, 'No Data',5, 3], } df = pd.DataFrame(dict(df)) # 处理无效值并转换列类型 df['inc_open_minutes'] = pd.to_numeric(df['inc_open_minutes'], errors='coerce') # 分组计算均值 dfTemp = df.groupby('inc_priority2')['inc_open_minutes'].mean().reset_index() dfTemp.columns = ['inc_priority2', 'Avg inc_open_minutes'] print(dfTemp)
运行结果:
inc_priority2 Avg inc_open_minutes 0 Critical 8.0 1 High 3.0 2 Medium 5.0 3 Low 3.0
pd.to_numeric的errors='coerce'参数会把无法转为数值的内容(比如"No Data")自动转成np.nan,后续mean()计算时会直接跳过这些缺失值。
方案二:替换为0后过滤非零值计算均值
如果一定要把"No Data"替换成0,可分组后对每个组过滤掉0值再计算均值:
import pandas as pd import numpy as np # 原始数据 df = { 'inc_priority2':['Critical','Critical','Critical','High','High','High','Medium','Medium','Low'], 'inc_open_minutes':['No Data',10,6, 'No Data',4,2, 'No Data',5, 3], } df = pd.DataFrame(dict(df)) # 替换No Data为0并转数值类型 df['inc_open_minutes'] = df['inc_open_minutes'].replace('No Data', 0).astype(int) # 分组后过滤0值计算均值 dfTemp = df.groupby('inc_priority2')['inc_open_minutes'].apply(lambda x: x[x != 0].mean()).reset_index() dfTemp.columns = ['inc_priority2', 'Avg inc_open_minutes'] print(dfTemp)
该方案也能得到目标结果,但需额外过滤操作,不如方案一简洁。
内容的提问来源于stack exchange,提问作者Peter Lucas
相关产品推荐
相关产品推荐

