pyspark:删除所有行中具有相同值的列
Posted
技术标签:
【中文标题】pyspark:删除所有行中具有相同值的列【英文标题】:pyspark: drop columns that have same values in all rows 【发布时间】:2018-12-17 03:26:26 【问题描述】:相关问题:How to drop columns which have same values in all rows via pandas or spark dataframe?
所以我有一个 pyspark 数据框,我想删除所有行中所有值都相同的列,同时保持其他列不变。
但上述问题的答案仅适用于熊猫。 pyspark 数据框有解决方案吗?
谢谢
【问题讨论】:
【参考方案1】:您可以在每列上应用 countDistinct()
聚合函数来获取每列不同值的计数。 count=1 的列意味着它在所有行中只有 1 个值。
# apply countDistinct on each column
col_counts = df.agg(*(countDistinct(col(c)).alias(c) for c in df.columns)).collect()[0].asDict()
# select the cols with count=1 in an array
cols_to_drop = [col for col in df.columns if col_counts[col] == 1 ]
# drop the selected column
df.drop(*cols_to_drop).show()
【讨论】:
我收到一个错误:TypeError: unhashable type: 'Column'【参考方案2】:您可以使用approx_count_distinct
函数 (link) 来计算列中不同元素的数量。如果只有一个不同的列,则删除相应的列。
创建数据帧
from pyspark.sql.functions import approx_count_distinct
myValues = [(1,2,2,0),(2,2,2,0),(3,2,2,0),(4,2,2,0),(3,1,2,0)]
df = sqlContext.createDataFrame(myValues,['value1','value2','value3','value4'])
df.show()
+------+------+------+------+
|value1|value2|value3|value4|
+------+------+------+------+
| 1| 2| 2| 0|
| 2| 2| 2| 0|
| 3| 2| 2| 0|
| 4| 2| 2| 0|
| 3| 1| 2| 0|
+------+------+------+------+
计算不同元素的数量并将其转换为字典。
count_distinct_df=df.select([approx_count_distinct(x).alias("0".format(x)) for x in df.columns])
count_distinct_df.show()
+------+------+------+------+
|value1|value2|value3|value4|
+------+------+------+------+
| 4| 2| 1| 1|
+------+------+------+------+
dict_of_columns = count_distinct_df.toPandas().to_dict(orient='list')
dict_of_columns
'value1': [4], 'value2': [2], 'value3': [1], 'value4': [1]
#Storing those keys in the list which have just 1 distinct key.
distinct_columns=[k for k,v in dict_of_columns.items() if v == [1]]
distinct_columns
['value3', 'value4']
删除具有不同值的列
df=df.drop(*distinct_columns)
df.show()
+------+------+
|value1|value2|
+------+------+
| 1| 2|
| 2| 2|
| 3| 2|
| 4| 2|
| 3| 1|
+------+------+
【讨论】:
以上是关于pyspark:删除所有行中具有相同值的列的主要内容,如果未能解决你的问题,请参考以下文章
查找具有 Null 值的列并将它们写入 Pyspark 中每条记录的新列中
Pyspark - 如何拆分具有 Datetime 类型的结构值的列?
将具有最接近值的列添加到 PySpark Dataframe