将Pandas DataFrame从宽格式转换为长格式
宽格式转长格式的实现方案
方法一:拆分后拼接(直观匹配目标顺序)
这种方法直接提取两组动作-时间列,重命名后拼接,完全匹配你想要的输出顺序:
import pandas as pd # 初始化原始数据 data = [['Tom', 'run', '2022-01-26', 'run', '2027-01-26'], ['Max', 'stop', '2020-11-16', 'run', '2022-04-26'], ['Bob', 'run', '2021-10-03', 'stop', '2022-01-26'], ['Ben', 'run', '2020-03-11', 'stop', '2013-01-26'], ['Eva', 'stop', '2017-11-16', 'run', '2015-01-26']] df = pd.DataFrame(data, columns=['person', 'action_1', 'time_1', 'action_2', 'time_2']) # 提取第一组动作-时间并改名 df_part1 = df[['person', 'action_1', 'time_1']].rename(columns={'action_1': 'action', 'time_1': 'time'}) # 提取第二组动作-时间并改名 df_part2 = df[['person', 'action_2', 'time_2']].rename(columns={'action_2': 'action', 'time_2': 'time'}) # 拼接两组数据并重置索引 df_long = pd.concat([df_part1, df_part2], ignore_index=True) print(df_long)
方法二:使用wide_to_long(适合批量处理多组列)
如果后续有更多类似action_n/time_n的列,用wide_to_long更高效,只需调整参数即可:
import pandas as pd # 初始化原始数据(同上) data = [['Tom', 'run', '2022-01-26', 'run', '2027-01-26'], ['Max', 'stop', '2020-11-16', 'run', '2022-04-26'], ['Bob', 'run', '2021-10-03', 'stop', '2022-01-26'], ['Ben', 'run', '2020-03-11', 'stop', '2013-01-26'], ['Eva', 'stop', '2017-11-16', 'run', '2015-01-26']] df = pd.DataFrame(data, columns=['person', 'action_1', 'time_1', 'action_2', 'time_2']) # 宽转长,指定前缀和标识符列 df_long = pd.wide_to_long(df, stubnames=['action', 'time'], i='person', j='event').reset_index() # 移除临时的event列,并排序保持原始顺序 df_long = df_long.sort_values('event', kind='mergesort').drop('event', axis=1).reset_index(drop=True) print(df_long)
两种方法都会输出你期望的长格式DataFrame。
内容的提问来源于stack exchange,提问作者juststarted
相关产品推荐
相关产品推荐

