我有一个数据框,我想以某种方式转置,其中的"列值变成列而不是值,而价格仍然是列。
我试图分组列和转置它,但没有找到一种方法来得到我想要的地方。这是我的数据集:
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
我从f.groupby(["attr", "values"])["price"].mean().reset_index().set_index("attr")开始,但没有得到想要的结构,这很可能涉及到数据集的转置。
任何帮助都非常感谢!
- https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.pivot.html is base capability
- 定义了一个列,每个m的变化ærke如果价格不是唯一的
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="ss+", 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()
圣ørrelse可耐福绝缘 南 Ø18毫米td>南南可耐福绝缘南
# 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