pandas 基于索引删除PySpark中的行

qlzsbp2j  于 2022-12-21  发布在  Spark
关注(0)|答案(1)|浏览(155)

我使用的PySpark Pandas DataFrame看起来类似于下图:

| col1 |          col2        | col3 |
|------|----------------------|------|
| 1    |'C:\windows\a\folder1'|  3   |
| 2    |'C:\windows\a\folder2'|  4   |
| 3    |'C:\windows\b\folder1'|  4   |
| 4    |'C:\unix\b\folder2'   |  5   |
| 5    |'C:\unix\a\folder3'   |  4   |

整个数据集相当大(大约55百万行),因此本示例仅为部分。
我尝试根据两个参数从中删除行:

  1. col 2是Windows服务器的路径,并且包含文件夹“a”
  2. col 3等于不等于3
    最终结果应该是这样的:
| col1 |          col2        | col3 |
|------|----------------------|------|
| 1    |'C:\windows\a\folder1'|  3   |
| 3    |'C:\windows\b\folder1'|  4   |
| 4    |'C:\unix\b\folder2'   |  5   |
| 5    |'C:\unix\a\folder3'   |  4   |

注意:由于它是Unix服务器,因此保留5;由于col 3值为3,因此保留1
由于ps.df.drop()函数不能根据索引删除数据,所以我尝试使用ps.df.filter过滤掉冗余数据。
然而,当我只使用第一个参数测试它时,它找不到任何值:

df.filter(like='\\windows\\a\\', axis=0)

Out[1]:
    | col1  | col2  | col3  |
    |-------|-------|-------|
    | blank | blank | blank |

要检查DataFrame不是我编写的问题:

df[ df.col2.str.contains('\\windows\\a\\', regex=False) ]

Out[2]:
    | col1 |          col2        | col3 |
    |------|----------------------|------|
    | 1    |'C:\windows\a\folder1'|  3   |

我还尝试了ps.sql()函数,但得到了与df.filter()相同的结果。
我不想在我的数据集中使用df.col2.str.contains()函数,因为它对如此大的数据集效率不高。
有人能告诉我为什么df.filter会失败,以及我如何才能在一个有效的庄园删除请求的列吗?

z4iuyo4d

z4iuyo4d1#

  • panda Dataframe 过滤器中like参数的值是针对索引的,而不是针对实际的列值。当我使用下面的代码在panda Dataframe 上使用filter时,它给出的结果为:

  • 由于您在spark API上使用的是panda Dataframe ,您可以首先使用to_spark()将此 Dataframe 转换为spark Dataframe 。
  • 我已经采取了您所提供的样本数据,并创建了一个Spark Dataframe 直接演示。
  • 为了得到想要的结果,我使用filter沿着like根据给定的条件进行过滤。
df.filter(~((df.c2.like("%windows%a%")) & (df.c3 != 3))).show()

相关问题