如何对DataFrame各列应用value_counts()生成指定格式值计数结果
pandas逐列value_counts横向拼接实现
实现逻辑
针对包含ID、Department、Level三列共8条记录的DataFrame,逐列调用value_counts()完成值频次统计,按要求横向拼接结果:
- 每个原始列和它的计数字段成对相邻排列
- 各列唯一值数量不一致时,短列无有效数据的后续位置自动补空对齐
- 支持配置同一列非首行位置留空的格式要求
完整代码
import pandas as pd # 构造8条记录的示例数据集 df = pd.DataFrame({ 'ID': [1, 2, 3, 4, 5, 2, 3, 3], 'Department': ['Tech', 'HR', 'Tech', 'Finance', 'HR', 'Tech', 'Finance', 'HR'], 'Level': ['P3', 'P4', 'P5', 'P4', 'P3', 'P5', 'P4', 'P3'] }) result_parts = [] max_row_count = 0 # 逐列做值频次统计 for col in df.columns: # 调用value_counts统计频次,重置索引生成「取值、计数」两列 col_count = df[col].value_counts().reset_index() col_count.columns = [col, '计数'] # 若需要同一列非首行的取值位置留空,取消注释下一行代码即可 # col_count.loc[1:, col] = '' result_parts.append(col_count) # 记录最长的统计结果行数,用于后续对齐 max_row_count = max(max_row_count, len(col_count)) # 横向拼接所有列的统计结果,长度不足的位置补空 final_result = pd.concat( [part.reindex(range(max_row_count), fill_value='') for part in result_parts], axis=1 ) # 打印输出最终结果 print(final_result)
输出效果
默认配置下(不启用留空规则)输出格式如下,所有取值完整显示,短列无数据位置自动留空:
| ID | 计数 | Department | 计数 | Level | 计数 |
|---|---|---|---|---|---|
| 3 | 3 | Tech | 3 | P3 | 3 |
| 2 | 2 | HR | 3 | P4 | 3 |
| 1 | 1 | Finance | 2 | P5 | 2 |
| 4 | 1 | ||||
| 5 | 1 |
注:统计结果默认按频次从高到低排序,和
value_counts()原生排序规则一致,不需要额外排序操作。
内容的提问来源于stack exchange,提问作者Demi
相关产品推荐
相关产品推荐

