如何在Python Pandas中仅对占比≥40%的类别执行dummy coding
仅对占比≥40%的类别执行虚拟编码
问题描述
现有如下结构的DataFrame:
COL1 | COL2 | COL3 | ... | COLn -----|------|------|------|---- 111 | A | Y | ... | ... 222 | A | Y | ... | ... 333 | B | Z | ... | ... 444 | C | Z | ... | ... 555 | D | P | ... | ...
需要仅针对每个类别变量中占比≥40%的类别,使用pandas.get_dummies()生成虚拟编码。以示例数据为例:
- COL2中只有"A"类别的占比达到40%(2/5)
- COL3中"Y"和"Z"的占比均为40%,符合要求
期望得到的输出结构如下:
COL1 | COL2_A | COL3_Y | COL3_Z | ... | COLn -------|---------|---------|--------|------|------- 111 | 1 | 1 | 0 | ... | ... 222 | 1 | 1 | 0 | ... | ... 333 | 0 | 0 | 1 | ... | ... 444 | 0 | 0 | 1 | ... | ... 555 | 0 | 0 | 0 | ... | ...
可复现代码
import pandas as pd df = pd.DataFrame() df["COL1"] = [111,222,333,444,555] df["COL2"] = ["A", "A", "B", "C", "D"] df["COL3"] = ["Y", "Y", "Z", "Z", "P"]
实现方案
可以通过以下步骤实现需求:
- 遍历目标类别列,筛选出占比≥40%的类别
- 仅对这些类别生成虚拟编码
- 合并原始非类别列与虚拟编码列
完整代码:
# 指定需要处理的类别列 categorical_columns = ["COL2", "COL3"] # 筛选每个列中符合占比要求的类别 qualified_categories = {} for col in categorical_columns: # 计算类别占比 category_ratios = df[col].value_counts(normalize=True) # 保留占比≥0.4的类别 qualified_categories[col] = category_ratios[category_ratios >= 0.4].index.tolist() # 生成目标虚拟编码列 dummy_dfs = [] for col, cats in qualified_categories.items(): # 生成虚拟变量 temp_dummy = pd.get_dummies(df[col], prefix=col) # 仅保留符合条件的类别对应的列 temp_dummy = temp_dummy[[f"{col}_{cat}" for cat in cats]] dummy_dfs.append(temp_dummy) # 合并结果:保留原始非类别列 + 虚拟编码列 final_df = pd.concat([df.drop(categorical_columns, axis=1)] + dummy_dfs, axis=1) print(final_df)
运行代码后输出:
COL1 COL2_A COL3_Y COL3_Z 0 111 1 1 0 1 222 1 1 0 2 333 0 0 1 3 444 0 0 1 4 555 0 0 0
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

