我的 pandas 数据框的特定转置

Specific transpose of my pandas Dataframe

我有一个数据框,我想以某种方式转置,其中“attr”列值变成列而不是值,而价格保持为列。

我已经尝试对列进行分组并转置它,但还没有找到到达我想要的位置的方法。这是我的数据集:

           attr                      values   price
0         Mærke            Knauf Insulation   24.95
1   Produkttype           Bygningsisolering   24.95
2         Serie                       SPACE   24.95
3         Model                  FORMSTYKKE   24.95
4         Mærke                   Bromiflex   20.00
5   Produkttype                     Rørskål   20.00
6     Materiale       Opskummet polyethylen   20.00
7     Størrelse                      Ø18 MM   20.00
8         Mærke                   Skamowall  190.00
9   Produkttype             Isoleringsplade  190.00
10        Serie                       BASIC  190.00
11    Materiale  Brændt kalk og mikrosilika  190.00
12        Mærke                    Rockwool  210.00
13  Produkttype           Bygningsisolering  210.00
14        Serie                 Terrænbatts  210.00
15    Materiale                     Stenuld  210.00
16        Mærke            Knauf Insulation   65.00
17  Produkttype                   Isolering   65.00

我要的是这个:

Mærke             Produkttype       Serie   Model      Materiale             Størrelse Price
Knauf Insulation  Bygningsisolering SPACE   FORMSTYKKE NAN                   NAN       24.95
Bromiflex         Rørskål           NAN     NAN        Opskummet polyethylen Ø18 MM    24.95     

我从 df.groupby(["attr", "values"])["price"].mean().reset_index().set_index("attr "),但没有得到想要的结构,这很可能涉及转置数据集。

非常感谢任何帮助!

# produce data
df = pd.DataFrame(data=[
    ("Mærke", "Knauf Insulation", 24.95),
    ("Produkttype", "Bygningsisolering", 24.95), 
    ("Serie", "SPACE", 24.95), 
    ("Mærke", "Bromiflex", 20.00), 
    ("Produkttype", "Rørskål", 20.00), 
    ("Materiale", "Opskummet polyethylen", 20.00), 
    ("Størrelse", "Ø18 MM", 20.00), 

    
    
], 
    columns = ("attr", "values", "price")
)

# display data
df.head()

# output

attr    values                           price
0       Mærke   Knauf Insulation         24.95
1       Produkttype Bygningsisolering    24.95
2       Serie   SPACE                    24.95
3       Mærke   Bromiflex                20.00
4       Produkttype Rørskål              20.00


# transform data using *pivot* method
df = df.pivot(columns="attr", values="values", index="price").reset_index()
df.columns.name = None

# show results
df.head()

# output

price   Materiale   Mærke   Produkttype Serie   Størrelse
0   20.00   Opskummet polyethylen   Bromiflex   Rørskål NaN Ø18 MM
1   24.95   NaN Knauf Insulation    Bygningsisolering   SPACE   NaN

import io
import pandas as pd

df = pd.read_csv(io.StringIO("""           attr                      values   price
0         Mærke            Knauf Insulation   24.95
1   Produkttype           Bygningsisolering   24.95
2         Serie                       SPACE   24.95
3         Model                  FORMSTYKKE   24.95
4         Mærke                   Bromiflex   20.00
5   Produkttype                     Rørskål   20.00
6     Materiale       Opskummet polyethylen   20.00
7     Størrelse                      Ø18 MM   20.00
8         Mærke                   Skamowall  190.00
9   Produkttype             Isoleringsplade  190.00
10        Serie                       BASIC  190.00
11    Materiale  Brændt kalk og mikrosilika  190.00
12        Mærke                    Rockwool  210.00
13  Produkttype           Bygningsisolering  210.00
14        Serie                 Terrænbatts  210.00
15    Materiale                     Stenuld  210.00
16        Mærke            Knauf Insulation   65.00
17  Produkttype                   Isolering   65.00"""), sep="\s\s+", engine="python")


df.assign(prod_idx=df["attr"].eq("Mærke").cumsum()).pivot(
    index=["prod_idx", "price"], columns="attr", values=["values"]
).droplevel(0,1).reset_index()
prod_idx price Materiale Model Mærke Produkttype Serie Størrelse
0 1 24.95 nan FORMSTYKKE Knauf Insulation Bygningsisolering SPACE nan
1 2 20 Opskummet polyethylen nan Bromiflex Rørskål nan Ø18 MM
2 3 190 Brændt kalk og mikrosilika nan Skamowall Isoleringsplade BASIC nan
3 4 210 Stenuld nan Rockwool Bygningsisolering Terrænbatts nan
4 5 65 nan nan Knauf Insulation Isolering nan nan