当前位置: 首页 > 知识库问答 >
问题:

如何在PySpark中使用pandas轴等价来删除列而不是行?

姬乐池
2023-03-14

我有一个spark dataframe,如下所示

df = pd.DataFrame({
'subject_id':[1,1,1,1,2,2,2,2,3,3,4,4,4,4,4],
'readings' : ['READ_1','READ_2','READ_1','READ_3',np.nan,'READ_5',np.nan,'READ_8','READ_10','READ_12','READ_11','READ_14','READ_09','READ_08','READ_07'],
 'val' :[5,np.nan,7,np.nan,np.nan,7,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,46],
 })

from pyspark.sql.types import *
from pyspark.sql.functions import isnan, when, count, col

mySchema = StructType([ StructField("subject_id", LongType(), True)\
                       ,StructField("readings", StringType(), True)\
                       ,StructField("val", FloatType(), True)])

spark_df = spark.createDataFrame(df,schema=mySchema)

我想做的是删除包含超过80%的nan、NULL或0值的列?

我试过下面的东西,但不起作用

spark_df = spark_df.dropna(axis = 'columns',how=any,thresh=12)

共有1个答案

郎刚捷
2023-03-14

可以使用Dropna方法中的subset参数指定要在其中查找空值的列。

若要移除null值超过80%的所有列:

columns_to_drop = []
count_before = spark_df.count()

for column_name in spark_df.columns:
    temp_spark_df =  spark_df.dropna(subset=[column_name], how=any, thresh=12)
    count_after = temp_spark_df.count()

    if ((count_before-count_after)/count_before) > 0.8:
        columns_to_drop.append(column_name)


spark_df = spark_df.drop(*columns_to_drop)

 类似资料:
  • 有两个,我想删除一个。我该怎么办?

  • 问题内容: 我有一张桌子。为了快速升级/部署网站,我做了一个新表,其中包含一些新数据,方法是: 现在每个表都有一个PK列,看起来像: 重要的一点是,两个表都依赖于完全相同的序列。没有。就我的目的而言,这似乎还可以。 此后,我加载了新数据并重命名了表,以便将其作为实盘接管,而原始表变成了。现在我尝试删除: 足够公平,列默认值仍取决于顺序。 这是踢脚线。 因此,不再对序列具有任何可见的依赖关系,但是它

  • 在Pyspark中执行映射函数时,我经常希望删除映射函数失败的数据(在本例中,转换为xml)。我想知道在映射步骤中是否有一个干净的方法来实现这一点? 返回blank的明显解决方案仍然会在RDD中保留一个对象。 创建一个聪明的筛选器是浪费我的时间,而像try/except on这样的哑筛选器是浪费计算时间,因为我会对XML进行两次解析。

  • 问题内容: 我目前有一个数据框,其中包含以1和0作为值的列,我想遍历这些列并删除仅由0组成的列。到目前为止,这是我尝试过的: 在哪几年是我正在分析的不同年份的数据帧的列表,其中包括其中包含一个的列,而零则是包含所有零的列的列表。是否有更好的方法根据条件删除列?由于某些原因,我必须检查一列是否也位于零列表中,并将它们从零列表中删除,以获得所有零列的列表。 问题答案: df.loc[:, (df !=

  • 问题内容: 我遇到了一个问题。我不知道如何在不将后记留空的情况下删除行。 我正在使用Apache-POI 3.9,使用下一个代码时出现错误: 更新版本: 我找到了解决方案:但是由于每个删除行都减少了lastRowNum,所以我得到了空指针。 这是新版本: 最后更新: ManishChristian帮助我解决了这个问题! 问题答案: 试试下面的代码,它应该可以工作: 每次删除一行都需要减少一。并再次

  • 问题内容: 我有一个很大的数据集,我想删除包含值的列并返回一个新的数据框。我怎样才能做到这一点? 以下内容仅删除包含的单个列或行。 例如 在上述情况下,它将丢弃整个列,因为其值之一为空。 问题答案: 这是删除所有具有NULL值的所有列的一种可能的方法,以获取每列NULL值计数代码的源代码。 之前: 后: 希望这可以帮助!