Как разбить столбец с одинаковым разделителем - PullRequest
2 голосов
/ 07 июня 2019

Мой фрейм данных - это, и я хочу разделить мой фрейм данных двоеточием (:)

+------------------+
|Name:Roll_no:Class|
+------------------+
|      #ab:cd#:23:C|
|      #sd:ps#:34:A|
|      #ra:kh#:14:H|
|      #ku:pa#:36:S|
|      #ra:sh#:50:P|
+------------------+

и мне нужен мой фрейм данных:

+-----+-------+-----+
| Name|Roll_no|Class|
+-----+-------+-----+
|ab:cd|     23|    C|
|sd:ps|     34|    A|
|ra:kh|     14|    H|
|ku:pa|     36|    S|
|ra:sh|     50|    P|
+-----+-------+-----+

Ответы [ 3 ]

4 голосов
/ 07 июня 2019

Если нужно разделить по последним 2 :, используйте Series.str.rsplit, затем установите столбцы по имени разделенного столбца и в последний раз удалите первый и последний # путем индексации:

col = 'Name:Roll_no:Class'
df1 = df[col].str.rsplit(':', n=2, expand=True)
df1.columns = col.split(':')
df1['Name'] = df1['Name'].str[1:-1]
#if only first and last value
#df1['Name'] = df1['Name'].str.strip('#')
print (df1)
    Name Roll_no Class
0  ab:cd      23     C
1  sd:ps      34     A
2  ra:kh      14     H
3  ku:pa      36     S
4  ra:sh      50     P
2 голосов
/ 07 июня 2019

Использование read_csv () sep = ':' и quotechar = '#'

str = """Name:Roll_no:Class 
#ab:cd#:23:C 
#sd:ps#:34:A 
#ra:kh#:14:H 
#ku:pa#:36:S 
#ra:sh#:50:P"""

df = pd.read_csv(pd.io.common.StringIO(str), sep=':', quotechar='#')
>>> df
     Name  Roll_no Class
#0  ab:cd       23     C
#1  sd:ps       34     A
#2  ra:kh       14     H
#3  ku:pa       36     S
#4  ra:sh       50     P
0 голосов
/ 07 июня 2019

Вот как вы можете сделать это в pyspark:

Укажите разделитель и кавычку на чтение

Если вы читаете данные из файла,Вы можете использовать spark.read_csv со следующими аргументами:

df = spark.read.csv("path/to/file", sep=":", quote="#", header=True)
df.show()
#+-----+-------+-----+
#| Name|Roll_no|Class|
#+-----+-------+-----+
#|ab:cd|     23|    C|
#|sd:ps|     34|    A|
#|ra:kh|     14|    H|
#|ku:pa|     36|    S|
#|ra:sh|     50|    P|
#+-----+-------+-----+

Использовать регулярные выражения

Если вы не можете изменить способ чтения данных, и выНачиная с DataFrame, показанного в вопросе, вы можете использовать регулярные выражения для получения желаемого результата.

Сначала получите новые имена столбцов, разделив существующее имя столбца на ":"

new_columns = df.columns[0].split(":")
print(new_columns)
#['Name', 'Roll_no', 'Class']

Для столбца Name необходимо извлечь данные между # с.Для двух других столбцов необходимо удалить строки между # s (и следующими ":") и использовать pyspark.sql.functions.split для извлечения компонентов

from pyspark.sql.functions import regexp_extract, regexp_replace, split

df.withColumn(new_columns[0], regexp_extract(df.columns[0], r"(?<=#).+(?=#)", 0))\
    .withColumn(new_columns[1], split(regexp_replace(df.columns[0], "#.+#:", ""), ":")[0])\
    .withColumn(new_columns[2], split(regexp_replace(df.columns[0], "#.+#:", ""), ":")[1])\
    .select(*new_columns)\
    .show()
#+-----+-------+-----+
#| Name|Roll_no|Class|
#+-----+-------+-----+
#|ab:cd|     23|    C|
#|sd:ps|     34|    A|
#|ra:kh|     14|    H|
#|ku:pa|     36|    S|
#|ra:sh|     50|    P|
#+-----+-------+-----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...