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