如何将DataFrame中B列行值转为新列,映射C列值完成宽表转换
错误原因
你写的代码出现NaN是因为单独过滤出的C列Series保留了原始DataFrame的索引,和你初始化的只包含B==b1行的df索引不匹配,pandas赋值时会按索引对齐,不在初始化df索引范围内的位置就会填充NaN。
正确实现
你的需求是典型的长表转宽表场景,直接用pandas内置的pivot/pivot_table方法即可实现,不需要自己写循环。
格式2(全B值转列)实现代码
# 基础转换,B列所有值都转为新列 df_wide = main_df.pivot( index="A", # 分组保留的根节点列,多内部节点可传列表如["A", "D", "E"] columns="B", # 要转成列名的字段 values="C" # 新列的取值来源字段 ).reset_index() # 可选:按需求重命名列名 df_wide.columns = ["A", "B1", "B2"]
格式1(指定部分B值转列)实现代码
desired_cols = ["b1"] # 按需指定要保留的B列值 df_wide = main_df[main_df["B"].isin(desired_cols)].pivot( index="A", columns="B", values="C" ).reset_index() # 可选:重命名列 df_wide.columns = ["A", "B1"]
兼容重复键场景
如果存在同一A、B组合对应多个C值的情况,改用pivot_table指定聚合规则即可避免报错:
df_wide = main_df.pivot_table( index="A", columns="B", values="C", aggfunc="first" # 重复值取第一个,可根据业务需求替换为sum、last等规则 ).reset_index()
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

