转置 pandas 数据帧并垂直附加

transpose pandas dataframe and appending vertically

我目前有一个 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

到目前为止,我可以转置 table 并清理日期。但我不确定如何按照以下方式复制日期并设置颜色。对于这种情况,.pivot_table 或 .transpose() 会更好吗?任何见解表示赞赏。

首先,使用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'])

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

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

解释:

将 'Name' 和 'Type' 移动到索引中,将剩余列的列 headers 拆分为逗号和 space 以创建多索引列 headers。接下来,将两个级别堆叠到索引,然后进行一些重命名以根据需要创建列和 reset_index.

您可以使用此管道:

(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

您可以使用 pivot_longer from pyjanitor 来抽象重塑过程 - 在内部它使用 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