【问题标题】:transpose pandas dataframe and appending vertically转置熊猫数据框并垂直附加
【发布时间】:2021-10-28 06:08:09
【问题描述】:

我目前有一个 Pandas 数据框,像这样的 df

df = pd.DataFrame({'Name': ['A','B','C'], 'Type': ['Car', 'Car', 'Truck'] , '01/01/1991, RED': [10, 26, 30], '01/02/1991, YELLOW': [11,15,5], '01/05/1991, BLUE':[5,8,20]})
Name | Type  | 01/01/1991, RED | 01/02/1991, YELLOW | 01/05/1991, BLUE  |
A    | Car   | 10              | 11                 | 5                 | 
B    | Car   | 26              | 15                 | 8                 | 
C    | Truck | 30              | 5                  | 20                | 

我正在寻找的输出

Name | Date       | Type  | Color  | Number
A    | 01/01/1991 | Car   | RED    | 10
A    | 01/02/1991 | Car   | YELLOW | 11
A    | 01/05/1991 | Car   | BLUE   | 5
B    | 01/01/1991 | Car   | RED    | 26
B    | 01/02/1991 | Car   | YELLOW | 15
B    | 01/05/1991 | Car   | BLUE   | 8
C    | 01/01/1991 | Truck | RED    | 30
C    | 01/02/1991 | Truck | YELLOW | 5
C    | 01/05/1991 | Truck | BLUE   | 20

到目前为止,我能够转置表格并清理日期。但我不确定如何以下列方式复制日期并设置颜色。在这种情况下 .pivot_table 或 .transpose() 会更好吗?任何见解都值得赞赏。

【问题讨论】:

    标签: python pandas dataframe append pivot-table


    【解决方案1】:

    试试这个,有很多方法可以解决这个重塑:

    dfi = df.set_index(["Name", "Type"])
    dfi.columns = dfi.columns.str.split(", ", expand=True).rename(['Date', 'Color'])
    df_out = (
        dfi.stack([0, 1])
        .rename("Number")
        .reset_index()
    )
    df_out
    

    输出:

      Name   Type        Date   Color  Number
    0    A    Car  01/01/1991     RED    10.0
    1    A    Car  01/02/1991  YELLOW    11.0
    2    A    Car  01/05/1991    BLUE     5.0
    3    B    Car  01/01/1991     RED    26.0
    4    B    Car  01/02/1991  YELLOW    15.0
    5    B    Car  01/05/1991    BLUE     8.0
    6    C  Truck  01/01/1991     RED    30.0
    7    C  Truck  01/02/1991  YELLOW     5.0
    8    C  Truck  01/05/1991    BLUE    20.0
    

    解释:

    将“名称”和“类型”移动到索引中,用逗号和空格分隔剩余列的列标题以创建 MultiIndex 列标题。接下来,将两个级别堆叠到索引,然后进行一些重命名以根据需要制作列并重置索引。

    【讨论】:

      【解决方案2】:

      您可以使用此管道:

      (df.melt(id_vars=['Name', 'Type'], value_name='Number')
         .assign(Date=lambda d: d['variable'].str[:10],
                 Color=lambda d: d['variable'].str[12:])
         .drop('variable', axis=1)
       )
      

      这会将数据框融合为长格式,并从原始列名中提取日期和颜色。

      输出:

        Name   Type  Number        Date   Color
      0    A    Car      10  01/01/1991     RED
      1    B    Car      26  01/01/1991     RED
      2    C  Truck      30  01/01/1991     RED
      3    A    Car      11  01/02/1991  YELLOW
      4    B    Car      15  01/02/1991  YELLOW
      5    C  Truck       5  01/02/1991  YELLOW
      6    A    Car       5  01/05/1991    BLUE
      7    B    Car       8  01/05/1991    BLUE
      8    C  Truck      20  01/05/1991    BLUE
      

      【讨论】:

        【解决方案3】:

        首先,使用melt

        data = df.melt(id_vars=['Name', 'Type'], value_name='Number')
        

        然后将variable列一分为二

        data[['Date', 'Color']] = data['variable'].str.split(',', 1, expand=True)
        

        最后删除variable 列,并按名称和日期排序

        data = data.drop(['variable'], axis=1).sort_values(by=['Name', 'Date'])
        

        【讨论】:

          【解决方案4】:

          您可以使用 pyjanitor 中的 pivot_longer 来抽象整形过程 - 在内部它使用 pd.melt/pd.concat :

          # pip install pyjanitor
          import pandas as pd
          import janitor
          df.pivot_longer(['Name', 'Type'],
                          names_to = ('Date', 'Color'), 
                          names_sep = ', ', 
                          sort_by_appearance = True)
           
            Name   Type        Date   Color  value
          0    A    Car  01/01/1991     RED     10
          1    A    Car  01/02/1991  YELLOW     11
          2    A    Car  01/05/1991    BLUE      5
          3    B    Car  01/01/1991     RED     26
          4    B    Car  01/02/1991  YELLOW     15
          5    B    Car  01/05/1991    BLUE      8
          6    C  Truck  01/01/1991     RED     30
          7    C  Truck  01/02/1991  YELLOW      5
          8    C  Truck  01/05/1991    BLUE     20
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-12-16
            • 2019-07-09
            • 1970-01-01
            • 2022-06-10
            • 1970-01-01
            • 2021-04-22
            相关资源
            最近更新 更多