当前位置: 首页 > 知识库问答 >
问题:

从spark dataframe中的列提取值,并将其提取到两个新列

郎正初
2023-03-14
    +----+------+-------------+
    |user| level|value_pair   |
    +----+------+-------------+
    | A  | 25   |(23.52,25.12)|
    | A  | 6    |(0,0)        |
    | A  | 2    |(11,12.12)   |
    | A  | 32   |(17,16.12)   |
    | B  | 22   |(19,57.12)   |
    | B  | 42   |(10,3.2)     |
    | B  | 43   |(32,21.0)    |
    | C  | 33   |(12,0)       |
    | D  | 32   |(265.21,19.2)|
    | D  | 62   |(57.12,50.12)|
    | D  | 32   |(75.12,57.12)|
    | E  | 63   |(0,0)        |
    +----+------+-------------+
    +----+------+-------------+-------+
    |user| level|value1       |value2 |
    +----+------+-------------+-------+
    | A  | 25   |23.52        |25.12  |
    | A  | 6    |0            |0      |
    | A  | 2    |11           |12.12  |
    | A  | 32   |17           |16.12  |
    | B  | 22   |19           |57.12  |
    | B  | 42   |10           |3.2    |
    | B  | 43   |32           |21.0   |
    | C  | 33   |12           |0      |
    | D  | 32   |265.21       |19.2   |
    | D  | 62   |57.12        |50.12  |
    | D  | 32   |75.12        |57.12  |
    | E  | 63   |0            |0      |
    +----+------+-------------+-------+
    df = df.withColumn('value1', pyspark.sql.functions.split(df['value_pair'], ',')[0]
    df = df.withColumn('value2', pyspark.sql.functions.split(df['value_pair'], ',')[1]

但我如何也摆脱这些假想呢?

共有1个答案

蒋承教
2023-03-14

对于括号,如注释所示,可以使用regexp_replace,但也需要包括\。反斜杠\是正则表达式的转义字符。

另外,我相信您需要首先删除括号,然后展开列。

from pyspark.sql.functions import split
from pyspark.sql.functions import regexp_replace

df = df.withColumn('value_pair', regexp_replace(df.value_pair, "\(",""))
df = df.withColumn('value_pair', regexp_replace(df.value_pair, "\)",""))

df = df.withColumn('value1', split(df['value_pair'], ',').getItem(0)) \
       .withColumn('value2', split(df['value_pair'], ',').getItem(1))
>>> df.show(truncate=False)

+----+-----+-----------+------+---------+
|user|level|value_pair |value1|value2   |
+----+-----+-----------+------+---------+
| A  |25   |23.52,25.12|23.52 |25.12    |
| A  |6    |0,0        |0     |0        |
| A  |2    |11,12.12   |11    |12.12    |
| A  |32   |17,16.12   |17    |16.12    |
| B  |22   |19,57.12   |19    |57.12    |
| B  |42   |10,3.2     |10    |3.2      |
| B  |43   |32,21.0    |32    |21.0     |
| C  |33   |12,0       |12    |0        |
| D  |32   |265.21,19.2|265.21|19.2     |
| D  |62   |57.12,50.12|57.12 |50.12    |
| D  |32   |75.12,57.12|75.12 |57.12    |
| E  |63   |0,0        |0     |0        |
+----+-----+-----------+------+---------+

正如注意到的,我稍微改变了您的代码如何获取这两个项目。

 类似资料:
  • 在JMeter中:我在一个线程组中使用了两个http请求,因此我从这些http请求中获得了两个响应。我需要‘成员ID'从一个响应和一些字符串(摘要)从其他响应,以便创建第三个http请求。 在使用两个正则表达式提取器时,我添加了两个调试采样器。 然后,我将提取的值'member id'和string(摘要)作为参数传递给第三个http请求。 当我运行它时,我得到了错误,我的第三个http请求失败了

  • 我将一个DBF文件输入到数据框中并运行查询。 这是密码。 然后得到这样一个错误。。KeyError:[Int64Index([0],dtype='int64')]中没有一个在[columns]中 这是我想要的文本文件的输出..."2020-01-01 943 527.0 56.46 56.46 0.0 0.0"

  • Q非常业余的程序员在这里,寻求你的帮助。 我必须经常编辑这样的xml文件 使用一个相当复杂的正则表达式搜索和替换过程,我只能提取标记属性的值。(这就是我所关心的)。 但是这很耗时,而且在Python中必须有非常简单的方法来查找属性标记="SOME_TEXT"部分并将所有值放入一个数组中,然后打印出该数组(到文件中)。但是我无法弄清楚:( 我正在寻找一种不包括导入任何类型的XML库的方法,因为我想让

  • 我需要对以下示例JSON执行Jolt转换: 输入

  • 我将如何从从excel文件创建的Dataframe中提取列与特定值匹配的行? 以下是Dataframe中的几行: 这是我用来读取excel文件的代码,选择我需要的列并适当地重命名它们: 到目前为止,根据诸如这个、这个或这里的答案,我只能返回第一个索引,其中Food=“Total fruit”。当我尝试上述其他方法时,我只得到列名,例如: 我对熊猫不熟悉,看不出哪里出了问题。为什么我可以提取第一行食