首页 > 解决方案 > 从数据框列表中制作单个数据框

问题描述

我有一个数据框列表,在列表的每个位置,我有一个数据框,我需要将所有这些数据框组合在一个数据框中。这是在 PySpark 中完成的,在我使用之前

dataframe_new =pd.concat(listName)

解决方案 1

from pyspark.sql.types import *

import pyspark.sql

from pyspark.sql import SparkSession, Row

customSchema = StructType([

  StructField("col1",      StringType(), True),

  StructField("col2", StringType(), True),

  StructField("col3", StringType(), True),

  StructField("col4",  StringType(), True),

  StructField("col5", StringType(), True),

  StructField("col6",  StringType(), True),

  StructField("col7", StringType(), True)

])



df = spark.createDataFrame(queried_dfs[0],schema=customSchema)

解决方案2我试过:(遍历数据框列表,但不知道如何组合它们

for x in ListOfDataframe
    new_df=union_all()

但这总是创建一个 new_df

有什么帮助解决这个问题吗?

标签: listpysparkapache-spark-sqljupyter-notebookpyspark-dataframes

解决方案


即使列或列的顺序不同,这也是组合数据框列表的有用功能

def Zconcat(dfs):
    return reduce(lambda df1, df2: df1.union(df2.select(df1.columns)), dfs) 

def union_all(dfs):
    columns = reduce(lambda x, y : set(x).union(set(y)), [ i.columns for i in dfs ]  )

    for i in range(len(dfs)):
        d = dfs[i]
        for c in columns:
            if c not in d.columns:
                d = d.withColumn(c, lit(None))
        dfs[i] = d

    return Zconcat(dfs)

然后将 union_all 传递给数据帧列表,例如

union_all([df1, df2, df3])

推荐阅读