pyspark如何使用两个标题行取消转csv [重复]

Posted

技术标签:

【中文标题】pyspark如何使用两个标题行取消转csv [重复]【英文标题】:pyspark how to unpivot the csv with two header lines [duplicate] 【发布时间】:2020-08-03 03:09:02 【问题描述】:

如何使用 pyspark 或 pandas 来实现以下转换?非常感谢。 源文件为 csv,包含以下信息:

预期:

【问题讨论】:

您能否添加一个代码来创建您的示例数据以及您到目前为止所尝试的内容以及您遇到的问题? 源文件为csv文件。 这能回答你的问题吗? Unpivot in spark-sql/pyspark 【参考方案1】:

我假设您的源 CSV 文件如下:

 ,Group_1,Group_2
 ,Sub_Group_1,Sub_Group_1
Maturity,7/31/20,7/31/20
0.1,0.2,0.3
0.2,0.3,0.4

注意:

前 2 行有初始空格(前 2 个 MultiIndex 的名称 第一列的级别),否则 read_csv 会给他们 未命名...默认名称, 列上实际上有 3 个 MultiIndex 级别(第三级 包含日期)。

我读到他们打电话给df = pd.read_csv('Input.csv', header=[0,1,2]) 和 内容是:

               Group_1     Group_2
           Sub_Group_1 Sub_Group_1
  Maturity     7/31/20     7/31/20
0      0.1         0.2         0.3
1      0.2         0.3         0.4

(你应该包含它而不是图片)。

第一步是融化

result = pd.melt(df, id_vars=[(' ', ' ', 'Maturity')],
    var_name=['Group_Name', 'Sub_Group_Name', 'Date'])

请注意,在上面的代码中,我将 id_vars 指定为 tuple, 有 2 个顶部元素作为空格(这就是为什么我做出关于 初始空格)。

结果是:

   ( ,  , Maturity) Group_Name Sub_Group_Name     Date  value
0               0.1    Group_1    Sub_Group_1  7/31/20    0.2
1               0.2    Group_1    Sub_Group_1  7/31/20    0.3
2               0.1    Group_2    Sub_Group_1  7/31/20    0.3
3               0.2    Group_2    Sub_Group_1  7/31/20    0.4

而唯一要做的就是重命名第一列:

result.rename(columns=result.columns[0]: 'Maturity', inplace=True)

现在,当你打印结果时,你会得到:

   Maturity Group_Name Sub_Group_Name     Date  value
0       0.1    Group_1    Sub_Group_1  7/31/20    0.2
1       0.2    Group_1    Sub_Group_1  7/31/20    0.3
2       0.1    Group_2    Sub_Group_1  7/31/20    0.3
3       0.2    Group_2    Sub_Group_1  7/31/20    0.4

行排序有点不同,但这是 melt 的工作方式。 如果您对此细节不满意,请根据您的 需要。

【讨论】:

以上是关于pyspark如何使用两个标题行取消转csv [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使 pyspark 和 ML(无 RDD)与大型 csv 一起工作?

重命名 Pyspark Dataframe 中的未命名列

如何使用模式匹配从 pyspark 数据框中删除行?

为啥有两个选项可以在 PySpark 中读取 CSV 文件?我应该使用哪一个?

在 csv 文件中查找行的最大值,同时排除 pyspark 中的标题

Pyspark 的 sqlContext.read.csv() 函数读取的行数比实际 .csv 文件中的行数多