我的 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
- https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.pivot.html 是基础能力
- 定义了一个列,每个 Mærke 都会发生变化,以防 price 不是唯一的
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
我有一个数据框,我想以某种方式转置,其中“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
- https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.pivot.html 是基础能力
- 定义了一个列,每个 Mærke 都会发生变化,以防 price 不是唯一的
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 |