【问题标题】:pyspark: drop columns that have same values in all rowspyspark:删除所有行中具有相同值的列
【发布时间】:2018-12-17 03:26:26
【问题描述】:

相关问题:How to drop columns which have same values in all rows via pandas or spark dataframe?

所以我有一个 pyspark 数据框,我想删除所有行中所有值都相同的列,同时保持其他列不变。

但上述问题的答案仅适用于熊猫。 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|
    +------+------+
    

    【讨论】:

      猜你喜欢
      • 2017-11-07
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      相关资源
      最近更新 更多