Найдите «Правильный случай» и пометьте его как недействительный с помощью Pyspark. - PullRequest
1 голос
/ 13 февраля 2020

У меня большой набор данных с несколькими столбцами. Ниже приведен пример фрейма данных. Здесь в столбце «first» содержатся имена, которые я хочу проверить, является ли правильный регистр или нет? как Аамир должен быть Аамир и Аамир Малик должен быть Аамир Малик .

Input Data Frame

Я хочу что-то вроде ниже.

Reuired Output

Я использовал Pyspark и ниже коды, где я получаю правильный ответ, но я сначала я хочу его обнаружить, а затем внести изменения.

Здесь я добавил новый столбец «правильно» и выполнил функцию. name_check_1 = name_check.withColumn("correct", initcap(col("first")))

Затем сравните столбцы правильно и сначала, чтобы они дали мне неправильное имя дела. name_check_2 = name_check_1.filter('correct != first')

Мне нужен способ, чтобы сначала получить неправильный регистр, а затем исправить.

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Вы знаете, как использовать initcap, поэтому просто создайте новый столбец correct и сравните его со столбцом first, чтобы проверить, действительно ли он уже действителен:

df.withColumn("correct", initcap(lower(col("first")))) \
  .withColumn("flag", when(col("correct") != col("first"), lit("invalid")).otherwise("valid")) \
  .show()

Дает:

+---+-----------+-----------+-------+
| id|      first|    correct|   flag|
+---+-----------+-----------+-------+
|  1|      aamir|      Aamir|invalid|
|  2|      Aamir|      Aamir|  valid|
|  3|       atif|       Atif|invalid|
|  4|       Atif|       Atif|  valid|
|  5|      tahir|      Tahir|invalid|
|  6|     sameer|     Sameer|invalid|
|  7|     ifzaan|     Ifzaan|invalid|
|  8|Ifzaan Abcd|Ifzaan Abcd|  valid|
|  9|Saquib abcd|Saquib Abcd|invalid|
+---+-----------+-----------+-------+
2 голосов
/ 13 февраля 2020

Мое решение ниже:

Logi c: Нарезать строку для первого алфавита, проверить ее с правильной строкой, если она равна, она действительна, иначе недействительна. Сделайте заглавными буквами первый алфавит имени и фамилии и оставьте на нижний регистр и объединить. Выберите только соответствующие столбцы.

from pyspark.sql.functions import *
from pyspark.sql.types import *
values = [
(1,"aamir"),
(2,"Aamir"),
(3,"atif"),
(4,"Atif"),
(5,"tahir"),
(6,"sameer"),
(7,"ifzaan"),
(8,"Ifzaan"),
(9,"Saquib"),
(10,"aamir malik"),
(11,"adcA")


]
rdd = sc.parallelize(values)
schema = StructType([
    StructField("IDs", IntegerType(), True),
    StructField("first", StringType(), True)
])
#create dataframe 
data = spark.createDataFrame(rdd, schema)

#split first column into firstname and lastname
data = data.withColumn("firstname", split(data["first"]," ")[0]).withColumn("lastname", split(data["first"]," ")[1])

data = data \
        .withColumn("flag", when((trim(substring(data["firstname"],0,1)) == upper(trim(substring(data["firstname"],0,1)))) | 
                    (trim(substring(data["lastname"],0,1)) == upper(trim(substring(data["lastname"],0,1)))), lit("valid")).otherwise(lit("invalid"))) \
        .withColumn("correct" , concat(concat(upper(trim(substring(data["firstname"],0,1))), trim(lower(substring(data["firstname"],2,1000)))),lit(" "),
                                       when(data["lastname"].isNull(),lit("")) \
        .otherwise(concat(upper(trim(substring(data["lastname"],0,1))),trim(lower(substring(data["lastname"],2,1000))))))) \
        .select("IDs","first","flag","correct")

data.show()
#Result

+---+-----------+-------+-----------+
|IDs|      first|   flag|    correct|
+---+-----------+-------+-----------+
|  1|      aamir|invalid|     Aamir |
|  2|      Aamir|  valid|     Aamir |
|  3|       atif|invalid|      Atif |
|  4|       Atif|  valid|      Atif |
|  5|      tahir|invalid|     Tahir |
|  6|     sameer|invalid|    Sameer |
|  7|     ifzaan|invalid|    Ifzaan |
|  8|     Ifzaan|  valid|    Ifzaan |
|  9|     Saquib|  valid|    Saquib |
| 10|aamir malik|invalid|Aamir Malik|
| 11|       adcA|invalid|      Adca |
+---+-----------+-------+-----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...