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

如何将Pandas DataFrame行转列去重并解决数组长度不匹配报错

问题修复方案

错误原因

  • 你对drop_duplicates()返回的结果额外套了一层列表,导致公共维度字段的数组长度为1,和筛选出的Amount字段长度不匹配,触发索引对齐错误
  • 手动拆分字段拼接的方式没有做索引重置,不同Series的原始索引不一致也会导致赋值错位

最优实现方案

这个需求是典型的长表转宽表场景,直接使用pandas内置的pivot方法即可一步实现:

import pandas as pd

# 你原有构造df的代码不变
columns = ['Start', 'End', 'MeterS', 'MeterE', 'Value', 'Type', 'Amount', 'Unit']
data = {
            'Start': ['2021-06-15T09:59:50', '2021-06-15T09:59:50', '2021-06-15T09:59:50', '2021-06-14T09:57:35', '2021-06-14T09:57:35', '2021-06-14T09:57:35'],
            'End': ['2021-06-15T13:01:04', '2021-06-15T13:01:04', '2021-06-15T13:01:04', '2021-06-14T14:47:35', '2021-06-14T14:47:35', '2021-06-14T14:47:35'],
            'MeterS': [2188950, 2188950, 2188950, 2181600, 2181600, 2181600],
            'MeterE': [2196310, 2196310, 2196310, 2188950, 2188950, 2188950],
            'Value': [24, 24, 24, 87, 87, 87],
            'Type': ['type_A', 'type_B', 'type_C', 'type_A', 'type_B', 'type_C'],
            'Amount': [1, 3.02, 7.36, 1, 4.83, 7.35],
            'Unit': ['pc', 'h', 'k', 'pc', 'h', 'k']
        }
df = pd.DataFrame(data, columns=columns)

# 核心转换代码
df2 = df.pivot(
    index=['Start', 'End', 'MeterS', 'MeterE', 'Value'],
    columns='Type',
    values='Amount'
).reset_index()

# 重命名列符合要求
df2.columns = ['Start', 'End', 'MeterS', 'MeterE', 'Value', 'Amount_Type_A', 'Amount_Type_B', 'Amount_Type_C']

# 输出验证
print(df2)

运行后得到的df2结果如下:

StartEndMeterSMeterEValueAmount_Type_AAmount_Type_BAmount_Type_C
2021-06-14T09:57:352021-06-14T14:47:3521816002188950871.04.837.35
2021-06-15T09:59:502021-06-15T13:01:0421889502196310241.03.027.36

原有代码的修复版本

如果你要沿用你原来手动拼接的思路,修改后代码如下:

# 先提取公共维度的唯一值,不要外层套列表,同时重置索引
common_df = df[['Start', 'End', 'MeterS', 'MeterE', 'Value']].drop_duplicates(keep='first').reset_index(drop=True)
# 提取各Type的Amount值时同样重置索引,保证和公共维度的索引对齐
common_df['Amount_Type_A'] = df.loc[df.Type == 'type_A', 'Amount'].reset_index(drop=True)
common_df['Amount_Type_B'] = df.loc[df.Type == 'type_B', 'Amount'].reset_index(drop=True)
common_df['Amount_Type_C'] = df.loc[df.Type == 'type_C', 'Amount'].reset_index(drop=True)
df2 = common_df

内容的提问来源于stack exchange,提问作者stanvooz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:45:04