通过填充现有列在Pyspark Dataframe中创建新列

时间:2019-12-17 15:17:12

标签: dataframe pyspark

我正在尝试在现有的Pyspark DataFrame中创建新列。当前,DataFrame如下所示:

+----+----+---+----+----+----+----+
|Acct| M1D|M1C| M2D| M2C| M3D| M3C|
+----+----+---+----+----+----+----+
|   B|  10|200|null|null|  20|null|
|   C|1000|100|  10|null|null|null|
|   A| 100|200| 200| 200| 300|  10|
+----+----+---+----+----+----+----+

我想用M2C填充0列中的空值,并创建一个新列Ratio。我的预期输出如下:

+------+------+-----+------+------+------+------+-------+
| Acct |  M1D | M1C |  M2D |  M2C |  M3D |  M3C | Ratio |
+------+------+-----+------+------+------+------+-------+
|    B |   10 | 200 | null | null | 20   | null |     0 |
|    C | 1000 | 100 | 10   | null | null | null |     0 |
|    A |  100 | 200 | 200  | 200  | 300  | 10   |   200 |
+------+------+-----+------+------+------+------+-------+

我正在尝试通过使用以下代码行来达到我想要的结果。

df = df.withColumn('Ratio', df.select('M2C').na.fill(0))

上面的代码行产生了assertion error,如下所示。

AssertionError: col should be Column

我发现使用此link的可能解决方案是使用lit函数。 我将代码更改为

df = df.withColumn('Ratio', lit(df.select('M2C').na.fill(0))) 

上面的代码导致AttributeError: 'DataFrame' object has no attribute '_get_object_id'

如何获得所需的输出?

1 个答案:

答案 0 :(得分:2)

您在这里做错了两件事。

  1. df.select将返回一个数据框,而不是一列。
  2. na.fill将替换所有列中的空值,而不仅仅是特定列中的空值。

以下代码段将解决您的用例

from pyspark.sql.functions import col
df = df.withColumn('Ratio', col('M2C')).fillna(0, subset=['Ratio'])