从单个 pyspark 数据帧返回多个列

我正在尝试解析单个单列的pyspark数据帧,并获得具有多列的数据帧。我的数据帧如下所示:


   a  b               dic

0  1  2  {'d': 1, 'e': 2}

1  3  4  {'d': 7, 'e': 0}

2  5  6  {'d': 5, 'e': 4}

我想解析dic列并获取数据帧,如下所示。如果可能的话,我期待使用熊猫UDF。我的预期输出如下:


   a  b  c  d

0  1  2  1  2

1  3  4  7  0

2  5  6  5  4

这是我尝试解决:


schema = StructType([

    StructField("c", IntegerType()),

    StructField("d", IntegerType())])


@pandas_udf(schema,PandasUDFType.GROUPED_MAP)

def do_someting(dic_col):

    return (pd.DataFrame(dic_col))


df.apply(add_json).show(10)

但这给出了错误“DataFrame”对象没有属性“apply”


胡子哥哥
浏览 173回答 2
2回答

江户川乱折腾

您可以通过将简单引号替换为双引号来首先转换为 JSON 字符串,然后使用 from_json将其转换为结构列或映射列。如果您知道该词典的模式,则可以按如下方式操作:data = [    (1,   2,  "{'c': 1, 'd': 2}"),    (3,   4,  "{'c': 7, 'd': 0}"),    (5,   6,  "{'c': 5, 'd': 4}")]df = spark.createDataFrame(data, ["a", "b", "dic"])schema = StructType([    StructField("c", StringType(), True),    StructField("d", StringType(), True)])df = df.withColumn("dic", from_json(regexp_replace(col("dic"), "'", "\""), schema))df.select("a", "b", "dic.*").show(truncate=False)#+---+---+---+---+#|a  |b  |c  |d  |#+---+---+---+---+#|1  |2  |1  |2  |#|3  |4  |7  |0  |#|5  |6  |5  |4  |#+---+---+---+---+如果您不知道所有键,则可以将其转换为映射而不是结构,然后将其分解并透视以获取列形式的键:df = df.withColumn("dic", from_json(regexp_replace(col("dic"), "'", "\""), MapType(StringType(), StringType())))\       .select("a", "b", explode("dic"))\       .groupBy("a", "b")\       .pivot("key")\       .agg(first("value"))

交互式爱情

尝试:#to convert pyspark df into pandas:df=df.toPandas()df["d"]=df["dic"].str.get("d")df["e"]=df["dic"].str.get("e")df=df.drop(columns=["dic"])返回:   a  b  d  e0  1  2  1  21  3  4  7  02  5  6  5  4
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python