You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计DataFrame每行多列相同值数量及选择合适存储类型?

员工出勤统计问题解决方法

问题描述

我有一个以每月日期为列的DataFrame,每列对应日期的取值不同,示例如下:

Emp Number 01-Jul 02-Jul 03-Jul 04-Jul 05-Jul 06-Jul 07-Jul 08-Jul 09-Jul
   0     C1    WFH    WFH    WFH    WFH    WFH    WOH    WOH    WFH    WFH
   1     C2    WFH    WFH    WFH    WFH    WFH    WOH    WOH    WFH    WFH
   2     C3    WFH    WFH    WFH    WFH    WOH    WOH    WOH    WFH    WFH
   3     C4    WFH    WFH    WFH    WFH    WOH    WOH    WOH    WFH    WFH
   4     C5    WFH    WFH    WOH    WOH    WFH    WOH    WOH    WFH    WFH

希望得到如下格式的输出:

C1  WFH 7, WOH 2
C2  WFH 7, WOH 2
C3  WFH 6, WOH 3
C4  WFH 6, WOH 3
C5  WFH 5, WOH 4

请问如何遍历这些列统计数量,以及应该用什么数据类型存储输出?我曾尝试使用value_counts并将结果存入Series,但未成功。

解决方法

核心思路

无需手动遍历列,直接按行对日期列执行统计操作,再整理成目标格式。输出存储可选择字符串列表(方便打印)或字典(方便后续数据复用)。

代码实现

假设你的DataFrame名为df:

import pandas as pd

# 筛选日期列(排除'Emp Number'列)
date_columns = df.columns[1:]

# 按行统计WFH/WOH数量,补全缺失类别并转成整数类型
counts_df = df[date_columns].apply(pd.Series.value_counts, axis=1).fillna(0).astype(int)

# 生成目标格式的字符串列表
output_list = []
combined_df = df[['Emp Number']].join(counts_df)
for _, row in combined_df.iterrows():
    output_str = f"{row['Emp Number']}  WFH {row['WFH']}, WOH {row['WOH']}"
    output_list.append(output_str)

# 打印结果
for line in output_list:
    print(line)

存储输出的选项

  • 字符串列表:如上述代码中的output_list,直接遍历打印就能得到目标格式,适合仅需输出展示的场景。
  • 字典:若后续需要复用统计数据,可转成字典存储:
    output_dict = {}
    for _, row in combined_df.iterrows():
        output_dict[row['Emp Number']] = {'WFH': row['WFH'], 'WOH': row['WOH']}
    
    调用示例:output_dict['C1']['WFH']会返回7。

原尝试失败的原因

直接对单行使用value_counts得到的Series,可能因缺失类别(比如某员工没有WOH记录)导致索引不一致,合并时出现错误。上述代码通过fillna(0)补全缺失值,统一了列结构,解决了这个问题。


内容的提问来源于stack exchange,提问作者Rama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 07:53:19