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

如何将Pandas DataFrame多列数据转置为单列并按指定列分组排序

如何将Pandas DataFrame多列数据转置为单列并按指定列分组排序

嗨,我来帮你搞定这个问题!你当前的思路方向是对的——用melt来转置列,但后续用groupby.size()的操作搞错了方向,那个只是用来统计每组的行数,不是用来重组数据的。另外,你的melt代码里还有个小细节需要调整,我一步步给你讲:

问题分析

你想要的是把每一行的Data1到Data5都转成单独的行,同时保留对应的DateTime和UTCs,并且让同一时间戳的所有数据行排在一起。你之前的melt结果之所以看起来是按Data1、Data2分组,是因为melt默认会先处理完所有行的第一个value列,再处理第二个,以此类推。我们只需要在转置后做一次排序,就能得到你想要的结构。

正确步骤

1. 正确使用melt转置列

首先要确保value_vars只包含你要转置的数据列(也就是Data1到Data5),不要把UTCs也包含进去(你之前的代码里df.columns.drop('DateTime')会把UTCs也放进value_vars里,这是个小错误):

import pandas as pd

# 你的原始数据
df = pd.DataFrame([['2024-12-07 13:43:09.598022400', 49389, 13.043, 2.174, 0.000, 0.000, 0.000],
                   ['2024-12-07 13:43:10.601990400', 49390, 16.667, 0.000, 0.000, 0.000, 0.000],
                   ['2024-12-07 13:43:11.601984000', 49391, 14.894, 0.000, 3.021, 0.000, 1.428],
                   ['2024-12-07 13:43:12.591004800', 49392, 12.766, 2.128, 0.000, 2.128, 0.000],
                   ['2024-12-07 13:43:13.592035200', 49393, 14.894, 2.128, 0.000, 0.000, 0.000],
                  ], columns=['DateTime', 'UTCs', 'Data1', 'Data2', 'Data3', 'Data4', 'Data5'])

# 筛选出需要转置的数据列(Data1到Data5)
data_columns = [col for col in df.columns if col.startswith('Data')]

# 执行melt转置,指定id列为DateTime和UTCs
melted_df = df.melt(
    id_vars=['DateTime', 'UTCs'],
    value_vars=data_columns,
    value_name='Data'  # 把转置后的数值列命名为Data
)

2. 按DateTime和UTCs排序

转置后的数据是按Data1、Data2这样的列顺序排列的,我们需要按DateTime和UTCs排序,让同一时间戳的所有数据行聚在一起:

# 按DateTime和UTCs排序,重置索引
final_df = melted_df.sort_values(by=['DateTime', 'UTCs']).reset_index(drop=True)

# 如果不需要保留原来的列名(Variable列),可以删掉
final_df = final_df.drop('variable', axis=1)

3. 最终结果

运行后你会得到和你期望完全一致的结构:

DateTime   UTCs    Data
0  2024-12-07 13:43:09.598022400  49389  13.043
1  2024-12-07 13:43:09.598022400  49389   2.174
2  2024-12-07 13:43:09.598022400  49389   0.000
3  2024-12-07 13:43:09.598022400  49389   0.000
4  2024-12-07 13:43:09.598022400  49389   0.000
5  2024-12-07 13:43:10.601990400  49390  16.667
6  2024-12-07 13:43:10.601990400  49390   0.000
...

为什么你之前的方法不对?

  • 你的melt代码里value_vars包含了UTCs(因为你只排除了DateTime),这会导致额外的无效行,所以一定要明确指定数据列。
  • groupby(['DateTime', 'UTCs']).size()只是统计每个时间组有多少行,并不会改变数据的结构,所以得到的是计数结果,而不是展开后的DataFrame。

备注:内容来源于stack exchange,提问作者Swawa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:43:10