如何正确转换DataFrame行列并解决重复ID下的赋值错误
Pandas DataFrame列转换赋值错误的解决方法
原始数据
import pandas as pd df = pd.DataFrame({"ID": ['2425128168','4055518718', '4055497871', '4055497871'], "To": ['A', 'A', 'B', 'C'], "From": ['D', 'C', 'A', 'A'], "Qty":[10,20,30,40]}) df['Qty'] = df['Qty'].astype(int)
输出的原始DataFrame:
ID To From Qty 0 2425128168 A D 10 1 4055518718 A C 20 2 4055497871 B A 30 3 4055497871 C A 40
需求
将From列转换为A-F的独立列,把Qty的值填入对应From列的位置,其余位置填0,期望结果:
ID To From Qty A B C D E F 0 2425128168 A D 10 0 0 0 10 0 0 1 4055518718 A C 20 0 0 20 0 0 0 2 4055497871 B A 30 30 0 0 0 0 0 3 4055497871 C A 40 40 0 0 0 0 0
错误实现问题
原来的代码用['ID','To']作为pivot的索引,导致pivot后的多索引与原DataFrame的默认索引不匹配,reset_index(drop=True)后行顺序错乱,赋值时出现错位:
grouped = df.pivot(index=['ID','To'], columns='From', values='Qty') grouped = grouped.fillna(0) for i in ['A', 'B', 'C', 'D', 'E', 'F']: try: df[i] = grouped[i].reset_index(drop = True).astype(int) except: df[i] = 0
错误结果:
ID To From Qty A B C D E F 0 2425128168 A D 10 0 0 0 10 0 0 1 4055518718 A C 20 30 0 0 0 0 0 2 4055497871 B A 30 40 0 0 0 0 0 3 4055497871 C A 40 0 0 20 0 0 0
正确解决方法
方法一:使用get_dummies逐行计算(推荐)
利用哑变量和Qty相乘,直接生成对应列的值,无需处理索引匹配问题:
# 生成From列的哑变量,确保包含A-F所有列,缺失列填0 dummies = pd.get_dummies(df['From']).reindex(columns=['A','B','C','D','E','F'], fill_value=0) # 哑变量与Qty相乘,得到对应From列的数值 from_columns = dummies.mul(df['Qty'], axis=0) # 合并回原始DataFrame result = pd.concat([df, from_columns], axis=1) print(result)
输出结果完全符合预期。
方法二:修复pivot的索引匹配问题
使用原DataFrame的默认索引作为pivot的索引,保证行顺序一致:
# 以原df的默认索引作为pivot的index,确保行对应 grouped = df.pivot(index=df.index, columns='From', values='Qty').fillna(0) # 补充A-F中缺失的列,填0并转为int类型 grouped = grouped.reindex(columns=['A','B','C','D','E','F'], fill_value=0).astype(int) # 合并回原df result = pd.concat([df, grouped], axis=1) print(result)
内容的提问来源于stack exchange,提问作者Ulewsky
相关产品推荐
相关产品推荐

