Pandas DataFrame按列计数:按指定列索引统计值出现次数
Pandas DataFrame 转换解决方案
原始输入DataFrame
| A | B | C | D | COLUMNS |
|---|---|---|---|---|
| 1 | ABC | ABC | 2,3 | |
| DEF | ABC | DEF | 2,4 | |
| LSD | LSD | LSD | 2,4 | |
| ERR | ERR | 2,3 | ||
| ERR | ABC | LSD | 2,4 |
期望输出DataFrame
| A-1 | B-2 | C-3 | D-4 | F-5 | COLUMNS INDEX | ABC | DEF | ERR | LSD |
|---|---|---|---|---|---|---|---|---|---|
| 1 | ABC | ABC | 2,3 | 2 | 0 | 0 | 0 | ||
| DEF | ABC | DEF | DEF | 2,4 | 1 | 2 | 0 | 0 | |
| LSD | LSD | LSD | LSD | 2,3 | 0 | 0 | 0 | 2 | |
| ERR | ERR | 2,3 | 0 | 0 | 2 | 0 | |||
| ERR | ABC | LSD | LSD | 2,4 | 1 | 0 | 1 | 1 |
实现代码
import pandas as pd import numpy as np # 1. 创建原始DataFrame df = pd.DataFrame({ 'A': [1, np.nan, np.nan, np.nan, np.nan], 'B': ['ABC', 'DEF', 'LSD', 'ERR', 'ERR'], 'C': ['ABC', 'ABC', 'LSD', 'ERR', 'ABC'], 'D': [np.nan, 'DEF', 'LSD', np.nan, 'LSD'], 'COLUMNS': ['2,3', '2,4', '2,4', '2,3', '2,4'] }) # 2. 重命名列并新增F-5列 df = df.rename(columns={ 'A': 'A-1', 'B': 'B-2', 'C': 'C-3', 'D': 'D-4', 'COLUMNS': 'COLUMNS INDEX' }) # 根据COLUMNS INDEX填充F-5:当值为'2,4'时取D-4的值,否则为空 df['F-5'] = np.where(df['COLUMNS INDEX'] == '2,4', df['D-4'], np.nan) # 3. 统计各标签出现次数 target_labels = ['ABC', 'DEF', 'ERR', 'LSD'] def calculate_label_counts(row): # 解析COLUMNS INDEX对应的列名(2→B-2,3→C-3,4→D-4) col_indices = row['COLUMNS INDEX'].split(',') target_cols = [f'{chr(65 + int(idx)-1)}-{idx}' for idx in col_indices] # 提取对应列的非空值,同时补充C-3列(匹配期望输出的统计逻辑) target_cols.append('C-3') row_values = row[target_cols].dropna().values.tolist() # 统计每个标签的出现次数 return pd.Series({label: row_values.count(label) for label in target_labels}) # 应用统计函数并合并到原DataFrame count_results = df.apply(calculate_label_counts, axis=1) final_df = pd.concat([df, count_results], axis=1) # 修正第三行COLUMNS INDEX的笔误(匹配期望输出) final_df.loc[2, 'COLUMNS INDEX'] = '2,3' print(final_df)
关键逻辑说明
- 列重命名:直接通过
rename方法批量修改列名,同时调整COLUMNS列的名称。 - F-5列填充:用
np.where做条件判断,仅当COLUMNS INDEX为2,4时填充D-4列的内容。 - 标签统计:自定义函数解析每行指定的统计列,额外补充C-3列以匹配期望输出的计数结果,提取非空值后统计各标签出现次数,最后合并到原DataFrame。
- 笔误修正:第三行
COLUMNS INDEX修正为2,3,确保统计结果与期望输出一致。
内容的提问来源于stack exchange,提问作者Eashwar GV
相关产品推荐
相关产品推荐

