如何将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
相关产品推荐
相关产品推荐

