如何将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结果如下:
| Start | End | MeterS | MeterE | Value | Amount_Type_A | Amount_Type_B | Amount_Type_C |
|---|---|---|---|---|---|---|---|
| 2021-06-14T09:57:35 | 2021-06-14T14:47:35 | 2181600 | 2188950 | 87 | 1.0 | 4.83 | 7.35 |
| 2021-06-15T09:59:50 | 2021-06-15T13:01:04 | 2188950 | 2196310 | 24 | 1.0 | 3.02 | 7.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
相关产品推荐
相关产品推荐

