将类别列转换为二进制列并合并至DataFrame的技术需求
按ID分组将类别列转换为二进制标记列
需求是把DataFrame中的category列按id维度转换为二进制列:每个类别作为新列,对应id包含该类别则标记1,否则标记0,最终输出按id唯一值展示的结果。
原始数据
import pandas as pd df = pd.DataFrame({ "id": [0,1,1,3,3], "value1": ["ryan", "delta", "delta", "delta", "alpha"], "category": ["teacher", "pilot", "engineer", "pilot", "teacher"], "value2": [1, 1, 2, 3, 7] })
解决方案
最简洁的实现方式是结合get_dummies生成哑变量,再按id分组取最大值:
# 生成category列的哑变量 dummies = pd.get_dummies(df['category']) # 合并id列和哑变量列 df_combined = pd.concat([df[['id']], dummies], axis=1) # 按id分组取最大值(同一id下有该类别则保留1,无则0) finaldf = df_combined.groupby('id').max().reset_index()
也可以用pivot_table实现,逻辑更直观:
finaldf = df.pivot_table( index='id', columns='category', aggfunc=lambda x: 1 if x.any() else 0, fill_value=0 ).reset_index() # 整理列名,去掉层级结构 finaldf.columns = ['id'] + list(finaldf.columns.get_level_values(1)[1:])
输出结果
执行后得到的finaldf与预期一致:
print(finaldf) # id engineer pilot teacher # 0 0 0 0 1 # 1 1 1 1 0 # 2 3 0 1 1
内容的提问来源于stack exchange,提问作者AAA
相关产品推荐
相关产品推荐

