如何通过忽略初始列标题获得正确的Dataframe模式?

2024-04-27 04:53:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv文件,它没有头,因为这一点,当我将它转换为spark dataframe时,会收到警告,说“csv头不符合模式”

        ,a,b
       1,x,y
       2,x,y
       3,x,y <-- table looks like this (,a,b --> are header).

所以我想忽略初始列标题,得到正确的模式。
P.S:如果我用任何标题命名初始列,我将得到正确的模式


Tags: 文件csv警告标题dataframetable模式this
2条回答

这些数字看起来像一个索引,因此您应该使用index_col参数将它们视为一个索引

将pandas df转换为spark df:https://stackoverflow.com/a/54709925/11971785

import pandas as pd
import findspark
findspark.init()

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate()

df_pandas = pd.read_csv(r"...\your_csv.csv", index_col = 0)
df_spark = spark.createDataFrame(df_pandas)
spark_df.createOrReplaceTempView('df_spark')

或者,您可以删除第一行并明确指定标题,如下所示:

df_spark = spark.read.format("csv")\
.option("header", "false")\
.schema(schema=['x', 'a', 'b'])\
.load("...\PATH_to_your_csv")

要动态创建此明确指定的标题列表,可以尝试以下操作:

lst_columns = list(spark.textFile("...\PATH_to_your_csv")\
           .mapPartitions(lambda line: csv.reader(line,delimiter=',', quotechar='"'))\
           .filter(lambda line: len(line)==0).toPandas().iloc[0])

因此,如果我理解正确,基本上你需要重命名列名,要做到这一点,请使用下面的

df = df.withColumnRenamed('old_column', 'new_column')
df.show()

相关问题 更多 >