如何获取pandas.get_dummies()生成的独热编码列?
获取pd.get_dummies生成的新列列表的更优方案
首先看原始DataFrame和独热编码后的结果:
原始DataFrame:
>>> df n1 n2 dense c1 c2 c3 0 1 4 [1, 4] a h1 tt 1 2 5 [2, 5] b bbw ebay 2 3 6 [3, 6] c we yahoo
执行独热编码:
>>> df_updated = pd.get_dummies(df, prefix_sep='_', dummy_na=True, columns=['c1', 'c2', 'c3']) >>> df_updated n1 n2 dense c1_a c1_b c1_c c1_nan c2_bbw c2_h1 c2_we c2_nan c3_ebay c3_tt c3_yahoo c3_nan 0 1 4 [1, 4] 1 0 0 0 0 1 0 0 0 1 0 0 1 2 5 [2, 5] 0 1 0 0 1 0 0 0 1 0 0 0 2 3 6 [3, 6] 0 0 1 0 0 0 1 0 0 0 1 0
已知list(set(df_updated.columns) - set(df.columns))可以获取生成的新列,但该方法会打乱列的原始顺序,以下是几种更优的方案:
方案1:按列顺序筛选新列(简洁版)
直接遍历df_updated的列,筛选出不在原df列名中的列,保留列的原始顺序:
new_cols = [col for col in df_updated.columns if col not in df.columns]
输出结果:
['c1_a', 'c1_b', 'c1_c', 'c1_nan', 'c2_bbw', 'c2_h1', 'c2_we', 'c2_nan', 'c3_ebay', 'c3_tt', 'c3_yahoo', 'c3_nan']
方案2:按原分类列前缀精准筛选
如果担心原列和新列存在同名冲突(虽然本例中不会),可以通过判断列名是否以原分类列名加分隔符开头,来精准筛选:
original_cat_cols = ['c1', 'c2', 'c3'] prefix_sep = '_' new_cols = [col for col in df_updated.columns if any(col.startswith(f"{cat}{prefix_sep}") for cat in original_cat_cols)]
该方法同样保留列的原始顺序,且筛选逻辑更严谨。
方案3:提前预先生成新列名(无需依赖df_updated)
如果需要在生成df_updated之前就知道会生成哪些列,可以通过遍历原分类列的唯一值(含NaN),拼接前缀和分隔符来生成列名列表:
original_cat_cols = ['c1', 'c2', 'c3'] prefix_sep = '_' dummy_na = True new_cols = [] for col in original_cat_cols: # 获取列的唯一值(包含NaN) unique_vals = df[col].unique() for val in unique_vals: new_cols.append(f"{col}{prefix_sep}{val}") # 如果开启了dummy_na,添加_nan后缀的列名 if dummy_na: new_cols.append(f"{col}{prefix_sep}nan")
该方案适合需要提前规划列结构的场景,且能完全控制列的顺序。
内容的提问来源于stack exchange,提问作者noobie2023
相关产品推荐
相关产品推荐

