如何基于其他列的唯一值对任务数据表进行分组?
嘿,我来帮你解决基于列的唯一值分组数据表的问题~
首先,先把你提供的原始数据表整理成清晰的Markdown格式:
| TaskId | OwnerName | WorkerName | Category |
|---|---|---|---|
| 1 | Sara | Sara | 1 |
| 1 | Sara | Maya | 1 |
| 1 | Sara | Sara | 1 |
| 2 | Sara | Sara | 0 |
| 2 | Sara | Sara | 0 |
| 3 | Sam | Sam | 1 |
| 3 | Sam | Sam | 1 |
| 3 | Sam | Sam | 1 |
| 4 | Ella | Ella | 1 |
| 4 | Ella | Ella | 1 |
| 5 | Ella | Ella | 1 |
| 6 | Ella | Ella | 0 |
接下来,根据你“基于其他列的唯一值分组”的需求,我会给出两种常用工具的实现方法,都是日常处理数据表时最常用的:
1. 用SQL实现分组
如果你是在数据库里操作这个表,GROUP BY子句就是专门干这个的——你只需要指定想要按其唯一值分组的列,再搭配聚合函数就能得到你想要的结果。
举个例子,如果你想按OwnerName + Category的唯一组合分组,统计每个分组下有多少个唯一的Task,以及总共有多少条记录,可以这么写:
SELECT OwnerName, Category, COUNT(DISTINCT TaskId) AS unique_task_count, -- 统计分组内的唯一Task数量 COUNT(*) AS total_records -- 统计分组内的总记录数 FROM your_table_name -- 把这里换成你的表名 GROUP BY OwnerName, Category; -- 按这两列的唯一值分组
执行后会得到这样的结果:
| OwnerName | Category | unique_task_count | total_records |
|---|---|---|---|
| Sara | 1 | 1 | 3 |
| Sara | 0 | 1 | 2 |
| Sam | 1 | 1 | 3 |
| Ella | 1 | 2 | 3 |
| Ella | 0 | 1 | 1 |
要是你想按TaskId + OwnerName的唯一组合分组,只需要调整GROUP BY后面的列就行,比如:
SELECT TaskId, OwnerName, Category, COUNT(DISTINCT WorkerName) AS unique_workers, -- 统计每个任务下的唯一Worker COUNT(*) AS records_per_task -- 统计每个任务的记录数 FROM your_table_name GROUP BY TaskId, OwnerName, Category;
2. 用Python Pandas实现分组
如果是用Python处理数据,Pandas的groupby()方法用起来超方便,几步就能搞定:
首先先把数据加载成DataFrame:
import pandas as pd data = [ [1, 'Sara', 'Sara', 1], [1, 'Sara', 'Maya', 1], [1, 'Sara', 'Sara', 1], [2, 'Sara', 'Sara', 0], [2, 'Sara', 'Sara', 0], [3, 'Sam', 'Sam', 1], [3, 'Sam', 'Sam', 1], [3, 'Sam', 'Sam', 1], [4, 'Ella', 'Ella', 1], [4, 'Ella', 'Ella', 1], [5, 'Ella', 'Ella', 1], [6, 'Ella', 'Ella', 0] ] df = pd.DataFrame(data, columns=['TaskId', 'OwnerName', 'WorkerName', 'Category'])
然后按OwnerName和Category的唯一值分组,同时指定要统计的内容:
grouped_result = df.groupby(['OwnerName', 'Category']).agg( unique_task_count=('TaskId', 'nunique'), # 统计唯一Task数 total_records=('TaskId', 'count') # 统计总记录数 ).reset_index() print(grouped_result)
运行后输出的结果和SQL的结果完全一致:
OwnerName Category unique_task_count total_records 0 Ella 0 1 1 1 Ella 1 2 3 2 Sam 1 1 3 3 Sara 0 1 2 4 Sara 1 1 3
小提示
核心就是先明确你想基于哪几列的唯一组合来聚合数据,不管是SQL还是Pandas,只要把这些列指定为分组依据就行。如果需要统计去重后的数据,SQL用COUNT(DISTINCT 列名),Pandas用nunique();要是单纯统计行数,SQL用COUNT(*),Pandas用count()就好。
内容的提问来源于stack exchange,提问作者sara
相关产品推荐
相关产品推荐

