You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确转换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:54:13