通过 id 合并数据框中的行,试图避免列中的空值(Spark scala)
merge rows in a dataframe by id trying to avoid null values in columns (Spark scala)
我在 Spark scala 中开发,我想合并数据框中的一些行...
我的数据框是下一个:
+-------------------------+-------------------+---------------+------------------------------+
|name |col1 |col2 |col3 |
+-------------------------+-------------------+---------------+------------------------------+
| a | null| null| 0.000000|
| a | 0.000000| null| null|
| b | null| null| 0.000000|
| b | 300.000000| null| null|
+-------------------------+-------------------+---------------+------------------------------+
我想打开下一个数据帧:
+-------------------------+-------------------+---------------+------------------------------+
|name |col1 |col2 |col3 |
+-------------------------+-------------------+---------------+------------------------------+
| a | 0.000000| null| 0.000000|
| b | 300.000000| null| 0.000000|
+-------------------------+-------------------+---------------+------------------------------+
考虑到:
-某些列的所有值都可以为空。
-数据框中可以有很多列。
据我所知,我必须将 groupBy 与 agg() 一起使用,但我无法获得正确的表达式:
df.groupBy("name").agg()
- 您可以按照您的建议使用
groupby('name')
,然后ffill() + bfill()。
df = df.groupby('name').ffill().bfill().drop_duplicates(keep='first')
- 如果您想保留名称列,您可以使用 pandas update():
df.update(df.groupby('name').ffill().bfill())
df.drop_duplicates(keep='first', inplace=True)
结果 df:
name
col1
col2
col3
a
0
0
b
300
0
如果“merge”表示求和,则可以从数据框模式接收列列表并将其包含到“agg”中:
val df = Seq(
("a", Option.empty[Double], Option.empty[Double], Some(0.000000)),
("a", Some(0.000000), Option.empty[Double], Option.empty[Double]),
("b", Option.empty[Double], Option.empty[Double], Some(0.000000)),
("b", Some(300.000000), Option.empty[Double], Option.empty[Double])
).toDF(
"name", "col1", "col2", "col3"
)
val columnsToMerge = df
.columns
.filterNot(_ == "name")
.map(c => sum(c).alias(c))
df.groupBy("name")
.agg(columnsToMerge.head, columnsToMerge.tail: _*)
结果:
+----+-----+----+----+
|name|col1 |col2|col3|
+----+-----+----+----+
|a |0.0 |null|0.0 |
|b |300.0|null|0.0 |
+----+-----+----+----+
我在 Spark scala 中开发,我想合并数据框中的一些行...
我的数据框是下一个:
+-------------------------+-------------------+---------------+------------------------------+
|name |col1 |col2 |col3 |
+-------------------------+-------------------+---------------+------------------------------+
| a | null| null| 0.000000|
| a | 0.000000| null| null|
| b | null| null| 0.000000|
| b | 300.000000| null| null|
+-------------------------+-------------------+---------------+------------------------------+
我想打开下一个数据帧:
+-------------------------+-------------------+---------------+------------------------------+
|name |col1 |col2 |col3 |
+-------------------------+-------------------+---------------+------------------------------+
| a | 0.000000| null| 0.000000|
| b | 300.000000| null| 0.000000|
+-------------------------+-------------------+---------------+------------------------------+
考虑到:
-某些列的所有值都可以为空。
-数据框中可以有很多列。
据我所知,我必须将 groupBy 与 agg() 一起使用,但我无法获得正确的表达式:
df.groupBy("name").agg()
- 您可以按照您的建议使用
groupby('name')
,然后ffill() + bfill()。
df = df.groupby('name').ffill().bfill().drop_duplicates(keep='first')
- 如果您想保留名称列,您可以使用 pandas update():
df.update(df.groupby('name').ffill().bfill())
df.drop_duplicates(keep='first', inplace=True)
结果 df:
name | col1 | col2 | col3 |
---|---|---|---|
a | 0 | 0 | |
b | 300 | 0 |
如果“merge”表示求和,则可以从数据框模式接收列列表并将其包含到“agg”中:
val df = Seq(
("a", Option.empty[Double], Option.empty[Double], Some(0.000000)),
("a", Some(0.000000), Option.empty[Double], Option.empty[Double]),
("b", Option.empty[Double], Option.empty[Double], Some(0.000000)),
("b", Some(300.000000), Option.empty[Double], Option.empty[Double])
).toDF(
"name", "col1", "col2", "col3"
)
val columnsToMerge = df
.columns
.filterNot(_ == "name")
.map(c => sum(c).alias(c))
df.groupBy("name")
.agg(columnsToMerge.head, columnsToMerge.tail: _*)
结果:
+----+-----+----+----+
|name|col1 |col2|col3|
+----+-----+----+----+
|a |0.0 |null|0.0 |
|b |300.0|null|0.0 |
+----+-----+----+----+