求助:Pandas中数据透视与分组操作遇到问题
Pandas实现人员任务计数透视表
现有人员每日任务分配数据集,每人单日可能承担多项任务,因此对应多行记录。需要转换为每人一行的DataFrame,各列为不同任务的总计数,具体示例如下:
初始数据
| Name | 1/1/23 | 1/2/23 | 1/3/23 |
|---|---|---|---|
| Person 1 | Assignment A | Assignment B | Assignment C |
| Person 1 | Assignment D | "EMPTY" | "EMPTY" |
| Person 1 | "Empty" | "Empty" | "Empty" |
| Person 2 | Assignment E | "Empty" | "Empty" |
| Person 2 | "Empty" | "Empty" | Assignment E |
期望结果
| Name | Assignment A | Assignment B | Assignment C | Assignment D | Assignment E | "Empty" |
|---|---|---|---|---|---|---|
| Person 1 | 1 | 1 | 1 | 1 | 0 | 5 |
| Person 2 | 0 | 0 | 0 | 0 | 2 | 4 |
解决方案
数据清洗与格式转换
先将日期列转为长格式,同时统一处理Empty的不同写法(去除引号、统一大小写):import pandas as pd # 构造初始数据 data = { "Name": ["Person 1", "Person 1", "Person 1", "Person 2", "Person 2"], "1/1/23": ["Assignment A", "Assignment D", '"Empty"', "Assignment E", '"Empty"'], "1/2/23": ["Assignment B", '"EMPTY"', '"Empty"', '"Empty"', '"Empty"'], "1/3/23": ["Assignment C", '"EMPTY"', '"Empty"', '"Empty"', "Assignment E"] } df = pd.DataFrame(data) # 转换为长格式,保留Name作为标识列 df_melted = df.melt(id_vars="Name", var_name="Date", value_name="Task") # 清洗Task列:去除引号,统一Empty的写法 df_melted["Task"] = df_melted["Task"].str.replace('"', '', regex=False).str.capitalize()分组统计与透视
按Name和Task分组计数,再转换为宽格式,缺失值填充为0:# 分组统计每个任务的数量 task_counts = df_melted.groupby(["Name", "Task"]).size().reset_index(name="Count") # 透视成宽表,填充缺失值为0并转为整数 result = task_counts.pivot(index="Name", columns="Task", values="Count").fillna(0).astype(int) # 重置索引,让Name回到普通列 result = result.reset_index()调整列顺序(可选)
如果需要和期望结果的列顺序完全匹配,可手动指定列顺序:desired_columns = ["Name", "Assignment A", "Assignment B", "Assignment C", "Assignment D", "Assignment E", "Empty"] result = result[desired_columns]
最终输出
运行代码后得到的result即为目标DataFrame:
Name Assignment A Assignment B Assignment C Assignment D Assignment E Empty 0 Person 1 1 1 1 1 0 5 1 Person 2 0 0 0 0 2 4
内容的提问来源于stack exchange,提问作者EFaden
相关产品推荐
相关产品推荐

