我尝试了这里显示的另一种方法:Restructuring pyspark dataframe,它不适用于我的数据帧。
我有一个数据文件,如下所示:
Attribute Values ID Brand Model
--------------------------------------------
Colour Red 1 Sony xyz
Energy F 2 Samsung abc
Year 2020 1 Sony xyz
Energy C 1 Sony xyz
Colour Blue 2 Samsung abc我需要调整/调整我的桌子,如下所示:
Brand Model Colour Energy Year
--------------------------------------------
Sony xyz Red C 2020
Samsung abc Blue F 2021
etc...目前,我尝试使用此代码尝试按ID进行枢轴和分组,但它不允许我显示,我也不知道如何基于“属性”将‘value’作为值:
import pandas as pd
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType,StructField, StringType, IntegerType,BooleanType,DoubleType
import pyspark
spark = SparkSession.builder \
.master("local[1]") \
.appName("PySpark Read JSON") \
.getOrCreate()
df = spark.read.json("examplell.json")
df.printSchema()
df.show()
count = df.select('ID').distinct().count()
df_pivot = df.groupBy('ID').pivot('Attribute').agg('Values')
df_pivot.printSchema()
df_pivot.show()发布于 2022-07-16 17:33:18
您不需要在ID进行分组,而是需要按照brand和model进行分组。并且,在first()中使用类似于.agg()的聚合函数。
data_ls = [
('colour', 'red', 1, 'sony', 'xyz'),
('energy', 'f', 2, 'samsung', 'abc'),
('year', '2020', 1, 'sony', 'xyz'),
('energy', 'c', 1, 'sony', 'xyz'),
('colour', 'blue', 2, 'samsung', 'abc'),
('year', '2021', 2, 'samsung', 'abc')
]
data_sdf = spark.sparkContext.parallelize(data_ls). \
toDF(['attribute', 'values', 'id', 'brand', 'model'])
# +---------+------+---+-------+-----+
# |attribute|values| id| brand|model|
# +---------+------+---+-------+-----+
# | colour| red| 1| sony| xyz|
# | energy| f| 2|samsung| abc|
# | year| 2020| 1| sony| xyz|
# | energy| c| 1| sony| xyz|
# | colour| blue| 2|samsung| abc|
# | year| 2021| 2|samsung| abc|
# +---------+------+---+-------+-----+
data_sdf. \
groupBy(['brand', 'model']). \
pivot('attribute'). \
agg(func.first('values')). \
show()
# +-------+-----+------+------+----+
# | brand|model|colour|energy|year|
# +-------+-----+------+------+----+
# | sony| xyz| red| c|2020|
# |samsung| abc| blue| f|2021|
# +-------+-----+------+------+----+发布于 2022-07-22 07:47:23
groupBy()可能是不必要的,从您的数据示例中,不能聚合Values。因此,我建议如下:
df_pivot = df.pivot(index=[['Brand', 'Model']], columns='Attribute', values='Values')如果由于“品牌”+“模型”没有创建唯一的索引或行而遇到重复值异常,则添加“ID”作为索引的一部分。我认为ID是唯一的,一旦旋转。
https://stackoverflow.com/questions/73005696
复制相似问题