如何统计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
相关产品推荐
相关产品推荐

