我正在尝试在现有的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'
如何获得所需的输出?
答案 0 :(得分:2)
您在这里做错了两件事。
df.select
将返回一个数据框,而不是一列。na.fill
将替换所有列中的空值,而不仅仅是特定列中的空值。以下代码段将解决您的用例
from pyspark.sql.functions import col
df = df.withColumn('Ratio', col('M2C')).fillna(0, subset=['Ratio'])