Разделить столбец значений, разделенных пробелом, на отдельные столбцы для каждого значения в Python - PullRequest
0 голосов
/ 22 мая 2018

Как я могу преобразовать набор данных

a    |    a b c d 
s    |    e f g h
f    |    i j k l

в

a | a | b | c | d
s | e | f | g | h
f | i | j | k | l

Ответы [ 7 ]

0 голосов
/ 22 мая 2018

Предполагая, что ввод в форме строки, мы можем сделать

import re
s = "a    |    a b c d"
s = re.sub("\s+[^a-z]"," ",s) # Replacing all non-alphabet characters with a single space
s = re.sub(" ","|",s)

Это должно дать вам желаемый результат.Поскольку pandas 'replace сделан поверх стандартного python re.sub, эта информация должна хорошо работать для вас.

0 голосов
/ 22 мая 2018

Самый компактный

df.drop('c2', 1).join(df.c2.str.split(expand=True))

  c1  0  1  2  3
0  a  a  b  c  d
1  b  e  f  g  h
2  c  i  j  k  l

Без учета существующих столбцов 1

pd.DataFrame([[a] + b.split() for a, b in df.values])

   0  1  2  3  4
0  a  a  b  c  d
1  b  e  f  g  h
2  c  i  j  k  l

Без учета существующих столбцов 2

pd.DataFrame([' '.join(r).split() for r in df.values])

   0  1  2  3  4
0  a  a  b  c  d
1  b  e  f  g  h
2  c  i  j  k  l
0 голосов
/ 22 мая 2018

Более простой способ - использовать аргумент expand=True.

# sample data
df = pd.DataFrame({'c1':['a','b','c'], 'c2':['a b c d','e f g h','i j k l']})

# transform into multiple columns
df = pd.concat([df['c1'],df['c2'].str.split(' ', expand=True)], axis=1)

print(df)

  c1  0  1  2  3
0  a  a  b  c  d
1  b  e  f  g  h
2  c  i  j  k  l
0 голосов
/ 22 мая 2018

Учитывайте это df

df = pd.DataFrame({'col1':[1,2], 'col2': ['10 20 30 40', '56 76 554 3243']})

    col1    col2
0   1       10 20 30 40
1   2       56 76 554 3243

Вы можете разделить целые числа на col2, используя str.split.Вы можете вручную назначить получающиеся столбцы или использовать диапазон следующим образом.Я использовал пример с диапазоном, как вы упомянули в комментарии, что вы смотрите на все 99 столбцов.

cols = np.arange(df.col2.str.split(expand = True).shape[1])
df[cols] = df.col2.str.split(expand = True)

Вы получаете

    col1    col2            0   1   2   3
0   1       10 20 30 40     10  20  30  40
1   2       56 76 554 3243  56  76  554 3243
0 голосов
/ 22 мая 2018

Использование @chrisz setup

df.set_index('col1')['col2'].str.extractall('(\w+)')[0].unstack()

Вывод:

match  0  1  2  3
col1             
a      a  b  c  d
f      i  j  k  l
s      e  f  g  h
0 голосов
/ 22 мая 2018

Если каждая строка в этом наборе данных ограничена символом новой строки, вы можете сделать что-то вроде этого:

dataset = '''
a    |    a b c d 
s    |    e f g h
f    |    i j k l
'''
for row in dataset.splitlines():
    print('{} {} {} | {} | {} | {}'.format(*row.split()))

И результат будет таким, как вы ожидали.

a | a | b | c | d
s | e | f | g | h
f | i | j | k | l
0 голосов
/ 22 мая 2018

Предположим, что ваши данные действительно выглядят так:

  col1     col2
0    a  a b c d
1    s  e f g h
2    f  i j k l

join с findall

df.join(pd.DataFrame(df.col2.str.findall(r'\w+').values.tolist())).drop('col2', 1)

  col1  0  1  2  3
0    a  a  b  c  d
1    s  e  f  g  h
2    f  i  j  k  l
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...