【问题标题】:How do I convert time series data from wide to long format using python (pandas package)? [duplicate]如何使用 python(pandas 包)将时间序列数据从宽格式转换为长格式? [复制]
【发布时间】:2022-11-16 01:17:45
【问题描述】:

我有一些在不同时间点以宽格式获取的数据,需要将其转换为长格式以帮助分析并将其与另一个数据集合并。

数据格式为(其中 A_0 表示 A 在时间 0 的值,A_15 表示时间 15 的值):

import pandas as pd

df_wide = pd.DataFrame({'Subject': ['AA', 'BB', 'CC', 'DD'],
               'A_0': [1, 2, 3, 4],
               'A_15': [2, 3, 4, 5],
               'A_30': [3, 4, 5, 6],
               'B_0': [1, 2, 3, 4],
               'B_15': [2, 3, 4, 5],
               'B_30': [3, 4, 5, 6],
               'C_0': [1, 2, 3, 4],
               'C_15': [2, 3, 4, 5],
               'C_30': [3, 4, 5, 6]
                  
              }
             )

df_wide
  Subject  A_0  A_15  A_30  B_0  B_15  B_30  C_0  C_15  C_30
0      AA    1     2     3    1     2     3    1     2     3
1      BB    2     3     4    2     3     4    2     3     4
2      CC    3     4     5    3     4     5    3     4     5
3      DD    4     5     6    4     5     6    4     5     6

我希望将其转换为长格式并生成变量时间如下:

df_long = pd.DataFrame({'Subject': ['AA', 'AA', 'AA', 'BB', 'BB', 'BB', 'CC', 'CC', 'CC', 'DD', 'DD',       'DD'],
                    'Time': [0, 15, 30, 0, 15, 30, 0, 15, 30, 0, 15, 30],
                    'A': [1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6],
                    'B': [1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6],
                    'C': [1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6],       
                    })

df_long
   Subject  Time  A  B  C
0       AA     0  1  1  1
1       AA    15  2  2  2
2       AA    30  3  3  3
3       BB     0  2  2  2
4       BB    15  3  3  3
5       BB    30  4  4  4
6       CC     0  3  3  3
7       CC    15  4  4  4
8       CC    30  5  5  5
9       DD     0  4  4  4
10      DD    15  5  5  5
11      DD    30  6  6  6

我已经阅读了 pivot 和 melt 函数,但无法完全理解它 - 任何帮助将不胜感激。

厌倦了 pivot 和 melt 但不确定如何生成时间变量。

【问题讨论】:

    标签: python pivot reshape melt


    【解决方案1】:

    您可以使用pd.wide_to_long

    x = pd.wide_to_long(
        df_wide, i="Subject", j="Time", stubnames=["A", "B", "C"], sep="_"
    )
    print(x)
    

    印刷:

                  A  B  C
    Subject Time         
    AA      0     1  1  1
    BB      0     2  2  2
    CC      0     3  3  3
    DD      0     4  4  4
    AA      15    2  2  2
    BB      15    3  3  3
    CC      15    4  4  4
    DD      15    5  5  5
    AA      30    3  3  3
    BB      30    4  4  4
    CC      30    5  5  5
    DD      30    6  6  6
    

    【讨论】:

    • 出于兴趣,是否有一个等效的函数来执行此操作并将 x 转换回 df_wide?
    • @CB_datarookie 你可以做x.unstack() 然后展平列名。
    • x = x.sort_index()如果你想让它像更复杂的答案一样更'漂亮'~
    【解决方案2】:

    您还可以组合熔化、拆分和旋转。

    df_long=pd.melt (df_wide, id_vars=["Subject"], var_name="Time")
    df_long[["Time_letter", "Time"]]=df_long["Time"].str.split("_", expand=True)
    df_final=pd.pivot(df_long, index=["Subject", "Time"], columns="Time_letter", values="value")
    

    输出(具有多索引 - 如果需要,可以展平):

    Time_letter   A  B  C
    Subject Time
    AA      0     1  1  1
            15    2  2  2
            30    3  3  3
    BB      0     2  2  2
            15    3  3  3
            30    4  4  4
    CC      0     3  3  3
            15    4  4  4
            30    5  5  5
    DD      0     4  4  4
            15    5  5  5
            30    6  6  6
    

    【讨论】:

      猜你喜欢
      • 2018-04-29
      • 2015-09-19
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多