如何基于DataFrame列的条件汇总另一列值并绘制统计图表
代码错误原因
- 第一版代码问题:筛选子集后直接对全列做轴向求和,
activity列的数值也被计入总和,且没有单独提取count列做聚合,结果不符合预期。 - 第二版
np.where代码问题:存在列名拼写错误(将activity写为actibity),条件成立时取值列选错(取了activity列而非count列),还引用了当前DataFrame中不存在的hoursActive列,无法正常运行。
正确统计实现
首先导入依赖库,完成两个求和逻辑:
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 构造示例DataFrame,实际使用时替换为你自己的数据读取逻辑 df = pd.DataFrame({ 'activity': [1,2,3,4,5,6,7,8,9,10], 'count': [25,38,49,55,61,74,82,98,103,4084] }) # 需求1:筛选activity < 6的行,对count列求和 sum_lt_6 = df.loc[df['activity'] < 6, 'count'].sum() # 需求2:筛选activity <= 6的行,对count列求和 sum_le_6 = df.loc[df['activity'] <= 6, 'count'].sum() # 核对输出结果:sum_lt_6 = 228,sum_le_6 = 302 print(sum_lt_6, sum_le_6)
如果需要用np.where实现,可以参考如下写法:
np.where基础语法:np.where(判断条件, 条件为真时的返回值, 条件为假时的返回值)
# 标记符合条件的行 df['flag_lt6'] = np.where(df['activity'] < 6, 1, 0) df['flag_le6'] = np.where(df['activity'] <= 6, 1, 0) # 按标记求和 sum_lt_6_np = (df['count'] * df['flag_lt6']).sum() sum_le_6_np = (df['count'] * df['flag_le6']).sum()
结果可视化
通过柱状图展示两个统计值即可:
# 绘图配置 plt.figure(figsize=(6, 4)) label_list = ['activity < 6', 'activity <= 6'] value_list = [sum_lt_6, sum_le_6] plt.bar(label_list, value_list, color=['#4c72b0', '#dd8452']) # 在柱子上标注具体数值 for idx, val in enumerate(value_list): plt.text(idx, val + 8, str(val), ha='center') plt.ylabel('count列求和结果') plt.title('不同activity阈值下的count总和') plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者tryingToDevelopMyself
相关产品推荐
相关产品推荐

