(可选)将spark数据帧字符串col拆分为多个列

时间:2017-10-30 12:01:41

标签: python regex pyspark

我的数据集中有一列具有以下格式:

'XX4H30M'

我需要将这些序列中的数字提取到两列(' H'和' M)。

如果格式完全如上所述,以下(在熊猫中)可以满足我的需要:

d3 = df.colname.str.extract('([0-9])([0-9])', expand=True)
d3.columns = ['H', 'M']
df = pd.concat([df, d3])

但是,本系列中的大量单元格只包含

'XX45M'
 XX3H

有没有办法可选地提取这些模式以将它们插入到全局df中?

对于一组具体的例子:

df = pd.DataFrame({'A': ['XX1H30M', 'XX45M', 'XX2H'])

最终会成为

Out: 
A  H  M
0  XX1H30M  1  30
1  XX45M  0  45
2  XX2H  2  0

使用

在pandas中可以实现我所需要的
df = df.assign(H=recipes.col.str.extract('([0-9]+)H', expand=False),
      M=recipes.col.str.extract('([0-9]+)M', expand=False)).fillna(0)

您可以拆分列,并在pyspark中添加新列:

split_col = pyspark.sql.functions.split(df['col'], '-')
df = df.withColumn('H', split_col.getItem(0))
df = df.withColumn('M', split_col.getItem(1))

如何将此扩展到我的情况(例如' XX2H45M'有两列的模式?

2 个答案:

答案 0 :(得分:2)

在pyspark中,您可以使用regexp_extract

df = spark.createDataFrame(pd.DataFrame({'A': ['XX1H30M', 'XX45M', 'XX2H']}))

import pyspark.sql.functions as psf
df.withColumn("H", psf.regexp_extract("A", "([0-9]+)H", 1))\
    .withColumn("M", psf.regexp_extract("A", "([0-9]+)M", 1))\
    .show()

    +-------+---+---+
    |      A|  H|  M|
    +-------+---+---+
    |XX1H30M|  1| 30|
    |  XX45M|   | 45|
    |   XX2H|  2|   |
    +-------+---+---+

答案 1 :(得分:0)

我刚刚将pyspark RDD变成了一个带有' toPandas'的pandas数据帧。并使用了pandas命令:

df = df.assign(H=recipes.col.str.extract('([0-9]+)H', expand=False),
  M=recipes.col.str.extract('([0-9]+)M', expand=False)).fillna(0)
相关问题