通过采用现有列的比率在 Pyspark DataFrame 中创建新列
Create new column in Pyspark DataFrame by taking ratio of existing columns
我在 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|
+----+----+---+----+----+----+----+
我想要的输出如下所示:
+------+------+-----+------+------+------+------+-------+
| Acct | M1D | M1C | M2D | M2C | M3D | M3C | Ratio |
+------+------+-----+------+------+------+------+-------+
| B | 10 | 200 | null | null | 20 | null | 0 |
| C | 1000 | 100 | 10 | null | null | null | 10 |
| A | 100 | 200 | 200 | 200 | 300 | 10 | 20 |
+------+------+-----+------+------+------+------+-------+
我想利用 M2D
与 M3C
的比率来创建新列 Ratio
。在获取比率之前,我想用 0
填充 M2D
,用 1
填充 M3C
,这将在运行中执行,以避免空值并避免替换值。
我尝试使用以下代码来完成此操作。
df = df.withColumn('Ratio', col('M2D').fillna(0, subset=['M2D']) / col('M3C').fillna(1, subset=['M3C']))
上面的代码给了我下面的错误
TypeError: 'Column' object is not callable
如上错误所述,为了避免TypeError,我尝试了以下代码行。现在我使用的是 DataFrame 而不是列。
df = df.withColumn('Ratio', df.select('M2D').fillna(0, subset=['M2D']) / df.select('M3C').fillna(1, subset=['M3C']))
以上代码导致以下错误。
TypeError: unsupported operand type(s) for /: 'DataFrame' and 'DataFrame'
我怎样才能达到我想要的输出?
您应该在计算比率之前填充空值,如下所示:
df = df.fillna(0, subset=['M2D'])\
.fillna(1, subset=['M3C'])\
.withColumn('Ratio', col('M2D') / col('M3C'))
或者更简单,如果您只想避免计算中出现空值,请按如下方式使用 coalesce
:
df = df.withColumn('Ratio', coalesce(col('M2D'), lit(0)) / coalesce(col('M3C'), lit(1)))
我在 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|
+----+----+---+----+----+----+----+
我想要的输出如下所示:
+------+------+-----+------+------+------+------+-------+
| Acct | M1D | M1C | M2D | M2C | M3D | M3C | Ratio |
+------+------+-----+------+------+------+------+-------+
| B | 10 | 200 | null | null | 20 | null | 0 |
| C | 1000 | 100 | 10 | null | null | null | 10 |
| A | 100 | 200 | 200 | 200 | 300 | 10 | 20 |
+------+------+-----+------+------+------+------+-------+
我想利用 M2D
与 M3C
的比率来创建新列 Ratio
。在获取比率之前,我想用 0
填充 M2D
,用 1
填充 M3C
,这将在运行中执行,以避免空值并避免替换值。
我尝试使用以下代码来完成此操作。
df = df.withColumn('Ratio', col('M2D').fillna(0, subset=['M2D']) / col('M3C').fillna(1, subset=['M3C']))
上面的代码给了我下面的错误
TypeError: 'Column' object is not callable
如上错误所述,为了避免TypeError,我尝试了以下代码行。现在我使用的是 DataFrame 而不是列。
df = df.withColumn('Ratio', df.select('M2D').fillna(0, subset=['M2D']) / df.select('M3C').fillna(1, subset=['M3C']))
以上代码导致以下错误。
TypeError: unsupported operand type(s) for /: 'DataFrame' and 'DataFrame'
我怎样才能达到我想要的输出?
您应该在计算比率之前填充空值,如下所示:
df = df.fillna(0, subset=['M2D'])\
.fillna(1, subset=['M3C'])\
.withColumn('Ratio', col('M2D') / col('M3C'))
或者更简单,如果您只想避免计算中出现空值,请按如下方式使用 coalesce
:
df = df.withColumn('Ratio', coalesce(col('M2D'), lit(0)) / coalesce(col('M3C'), lit(1)))