Как проверить, содержит ли столбец только определенные буквы - PullRequest
1 голос
/ 19 июня 2020

У меня есть фрейм данных, и я хочу проверить один столбец, который, например, содержит только букву A.

Столбец содержит много букв. Это выглядит так:

AAAAAAAAAAAAAAAA AAABBBBBDBBSBSBB

Я хочу проверить, содержит ли этот столбец только букву A или обе буквы A или B, но ничего больше.

Знаете ли вы, какую функцию я буду использовать?

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Попробуйте следующее: я рассмотрел четыре образца букв. Мы можем использовать функцию rlike в Spark. Я использовал регулярное выражение [^AB]. Это вернет true в значения столбца, содержащие буквы, отличные от A или B, а False будет отображаться для значений, имеющих A или B или оба AB. мы можем отфильтровать False, и это будет ваш ответ.

    from pyspark.sql import SparkSession
    from pyspark.sql import functions as F

    spark = SparkSession.builder \
        .appName('SO')\
        .getOrCreate()

    li = [[("AAAAAAAAAAAAAAAAAAABBBBBDBBSBSBB")], [("AAAAAAAAA")],[("BBBBBBBB")], [("AAAAAABBBBBBBB")]]

    df = spark.createDataFrame(li, ["letter"])

    df.show(truncate=False)

    # 
    # +--------------------------------+
    # |letter                          |
    # +--------------------------------+
    # |AAAAAAAAAAAAAAAAAAABBBBBDBBSBSBB|
    # |AAAAAAAAA                       |
    # |BBBBBBBB                        |
    # |AAAAAABBBBBBBB                  |
    # +--------------------------------+

    df1 = df.withColumn("contains_A_or_B", F.col('letter').rlike("[^AB]"))

    df.show(truncate=False)

      +--------------------------------+---------------+
    # |letter                          |contains_A_or_B|
    # +--------------------------------+---------------+
    # |AAAAAAAAAAAAAAAAAAABBBBBDBBSBSBB|true           |
    # |AAAAAAAAA                       |false          |
    # |BBBBBBBB                        |false          |
    # |AAAAAABBBBBBBB                  |false          |
    # +--------------------------------+---------------+
    df1.filter(F.col('contains_A_or_B')==False).select("letter").show()


    # +--------------+
    # |        letter|
    # +--------------+
    # |     AAAAAAAAA|
    # |      BBBBBBBB|
    # |AAAAAABBBBBBBB|
    # +--------------+
0 голосов
/ 19 июня 2020

Используйте rlike. Пример из официальной документации:

df.filter(df.name.rlike('ice$')).collect()
[Row(age=2, name='Alice')]

http://spark.apache.org/docs/latest/api/python/pyspark.sql.html?highlight=regex#pyspark. sql .Column.rlike

...