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

通过填充现有列在Pyspark Dataframe中创建新列,dataframe,pyspark,Dataframe,Pyspark,我正在尝试在现有Pyspark数据帧中创建新列。当前,数据帧如下所示: +----+----+---+----+----+----+----+ |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

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

+----+----+---+----+----+----+----+
|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|
+----+----+---+----+----+----+----+
+------+------+-----+------+------+------+------+-------+
| 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 |
+------+------+-----+------+------+------+------+-------+
我想用
0
填充列
M2C
中的空值,并创建一个新列
Ratio
。我的预期产出如下:

+----+----+---+----+----+----+----+
|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|
+----+----+---+----+----+----+----+
+------+------+-----+------+------+------+------+-------+
| 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))
上面的代码行导致
断言错误
,如下所示

AssertionError: col should be Column
我发现使用此函数的可能解决方案是使用
lit
函数。 我把代码改成了

df = df.withColumn('Ratio', lit(df.select('M2C').na.fill(0))) 
上述代码导致
AttributeError:'DataFrame'对象没有属性'\u get\u object\u id'


我怎样才能达到我想要的输出?

你在这里做错了两件事

  • df。选择将返回数据帧,而不是列
  • na.fill
    将替换所有列中的空值,而不仅仅是特定列中的空值
  • 下面的代码片段将解决您的用例

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

    你在这里做错了两件事

  • df。选择将返回数据帧,而不是列
  • na.fill
    将替换所有列中的空值,而不仅仅是特定列中的空值
  • 下面的代码片段将解决您的用例

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