如何在使用字典时使用replace()方法替换列值?

时间:2019-04-16 12:21:58

标签: apache-spark-sql pyspark-sql

在使用replace方法替换df中的列值时,我们如何利用字典来做到这一点。我在语法上遇到问题。

   person = spark.createDataFrame([
    (0, "Bill Chambers", 0, [100]),
    (1, "Matei Zaharia", 1, [500, 250, 100]),
    (2, "Michael Armbrust", 1, [250, 100]),
    (1,'Adam',4,[200])])\
    .toDF("id", "name", "graduate_program", "spark_status")

diz={'Bill Chambers':'ABC','Adam':'DEF'}

I saw that the syntax is:
person.replace(diz,1,'name')

这里的参数1的意义是什么?

1 个答案:

答案 0 :(得分:0)

首先,我建议您检查pyspark documentation并搜索replace(to_replace, value=<no value>, subset=None)函数定义。

您正在传递带有键/值对的字典diz,由于该值1在您的情况下将被忽略,因此,您将获得以下结果:

>>> person.replace(diz,1,'name').show()
+---+----------------+----------------+---------------+
| id|            name|graduate_program|   spark_status|
+---+----------------+----------------+---------------+
|  0|             ABC|               0|          [100]|
|  1|   Matei Zaharia|               1|[500, 250, 100]|
|  2|Michael Armbrust|               1|     [250, 100]|
|  1|             DEF|               4|          [200]|
+---+----------------+----------------+---------------+

请注意,在您指定为name的仅使用情况列subset中会受到影响,并且您可以清楚地看到您的字典key/value对已被用作to_replace/value

现在,如果要测试value参数应如何工作,请查看以下示例:

>>> person.replace(['Adam', 'Bill Chambers'],['Bob', 'Omar'],'name').show()
+---+----------------+----------------+---------------+
| id|            name|graduate_program|   spark_status|
+---+----------------+----------------+---------------+
|  0|            Omar|               0|          [100]|
|  1|   Matei Zaharia|               1|[500, 250, 100]|
|  2|Michael Armbrust|               1|     [250, 100]|
|  1|             Bob|               4|          [200]|
+---+----------------+----------------+---------------+

注意,如果要为两列指定另一个to_replace / value列表,请检查dataframe.replace()的以下用法:

>>> person.replace([1, 0],[9, 5],['id', 'graduate_program']).show()
+---+----------------+----------------+---------------+
| id|            name|graduate_program|   spark_status|
+---+----------------+----------------+---------------+
|  5|   Bill Chambers|               5|          [100]|
|  9|   Matei Zaharia|               9|[500, 250, 100]|
|  2|Michael Armbrust|               9|     [250, 100]|
|  9|            Adam|               4|          [200]|
+---+----------------+----------------+---------------+

在前面的示例中,我们针对两个相同的值类型(int)列[id, graduate_program],并强制将所有1替换为9,将所有0替换为5。

我希望这能回答您的问题