dataframe - 如何在 PySpark 中查找非空值的列集合
问题描述
我有一个带有 n 列(Column_1,Column_2 ...... Column_n)的 Pyspark 数据框。我必须再添加一列,其中以逗号分隔的列集合。
条件:如果两个或多个列有值填充集合列中的逗号分隔值,例如。下面是三列的数据。
----------------------------------------------------------------------
| column_1 | column_2 | column_3 | col collections |
----------------------------------------------------------------------
| - | - | - | - |
------------------------------------------ ---------------------------
| 1 | - | - | - |
------------------------------------------ ---------------------------
| - | 1 | - | - |
------------------------------------------ ---------------------------
| - | - | 1 | - |
------------------------------------------ ---------------------------
| 1 | 1 | - | column_1,column_2 |
----------------------------------------------------------------------
| 1 | 1 | 1 | column_1,column_2,column_3 |
----------------------------------------------------------------------
| 1 | - | - | - |
----------------------------------------------------------------------
| - | 1 | 1 | column_2,column_3 |
----------------------------------------------------------------------
解决方案
这是一种解决方案。
import pandas as pd
from pyspark.sql.functions import concat_ws, udf
from pyspark.sql.types import StringType
pandas_df = pd.DataFrame({
'column_1': [None, '1', None, None, '1', '1', '1'],
'column_2': [None, None, '1', None, '1', '1', None],
'column_3': [None, None, None, '1', None, '1', None]
})
df = spark.createDataFrame(pandas_df)
df.show()
# +--------+--------+--------+
# |column_1|column_2|column_3|
# +--------+--------+--------+
# | null| null| null|
# | 1| null| null|
# | null| 1| null|
# | null| null| 1|
# | 1| 1| null|
# | 1| 1| 1|
# | 1| null| null|
# +--------+--------+--------+
def non_null_to_column_name(name):
return udf(lambda value: None if value is None else name, StringType())
atleast_two_udf = udf(lambda s: None if (s is None) or (',' not in s) else s,
StringType())
cols = []
for name in df.columns:
f = non_null_to_column_name(name)
cols += [f(df[name])]
df = df.withColumn('collection', atleast_two_udf(concat_ws(',', *cols)))
df.show()
# +--------+--------+--------+--------------------+
# |column_1|column_2|column_3| collection|
# +--------+--------+--------+--------------------+
# | null| null| null| null|
# | 1| null| null| null|
# | null| 1| null| null|
# | null| null| 1| null|
# | 1| 1| null| column_1,column_2|
# | 1| 1| 1|column_1,column_2...|
# | 1| null| null| null|
# +--------+--------+--------+--------------------+
推荐阅读
- javascript - 如何更改组件中的路由确实已安装
- amazon-redshift - 错误消息是 [Amazon](500310) Invalid operation: This type of associated subquery pattern is not supported due to internal error
- api - 如何获取在 BotFather 注册的所有机器人的列表?
- python - 有没有办法使用 pyodbc 使用 executemany 进行批量更新
- arrays - 如何在 MongoDB 中删除数组中的单词
- data-structures - 在查找具有公共前缀的单词时,哪种数据结构将具有最佳的预期渐近性能?
- c++ - 比较向量中的元素时所花费的时间呈指数增长
- angular - 在Angular中定义值时如何仅在HTML元素中显示id属性
- assembly - 创建新指令(双操作数)
- normalizr - 规范化狗 API