在pyspark中,当使用.agg方法时,为什么在列表表达式的头部添加一个星号

时间:2017-06-23 10:04:45

标签: apache-spark dataframe pyspark apache-spark-sql spark-dataframe

数据是:

import pyspark.sql.functions as fn
df_miss_no_income.show()
+---+------+------+----+------+
| id|weight|height| age|gender|
+---+------+------+----+------+
|  1| 143.5|   5.6|  28|     M|
|  2| 167.2|   5.4|  45|     M|
|  3|  null|   5.2|null|  null|
|  4| 144.5|   5.9|  33|     M|
|  5| 133.2|   5.7|  54|     F|
|  6| 124.1|   5.2|null|     F|
|  7| 129.2|   5.3|  42|     M|
+---+------+------+----+------+

我想用填充null的方法,所以

 means = df_miss_no_income.agg(*[fn.mean(c).alias(c) for c in df_miss_no_income.columns if c != 'gender']).toPandas().to_dict('records')[0]

但我不明白为什么.agg方法的列表表达式的头部应该添加一个星号.agg(*[fn.mean(c).alias(c) for c in df_miss_no_income.columns if c != 'gender'])

1 个答案:

答案 0 :(得分:1)

agg函数接收多个列参数作为输入。这与例如列表的单个参数不同。在python中,*可用于解压缩列表对象并将其值放入您正在调用的函数的参数列表中的连续点中。例如:

def testFn(arg1, arg2, arg3):
    print arg1, arg2, arg3

# Normal call
testFn("1", "a", "b")

# Call using list unpacking
list_vals = ["1", "a", "b"]
testFn(*list_vals)

注意,字典存在类似的概念,并将它们转储到函数的关键字参数中。在这种情况下,你使用两个明星,如" **"。