Как я могу преобразовать набор данных
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
представлен в виде строки
так, по сути, вот так? dataset = 'a | a b c d \ s | e f g h \ f | i j k l'
a - это int. a, b, c, d также являются целыми числами, но конечным значением второго столбца является строка. т.е. 5 | 120 154 564 5454
Это все одна колонка? Имеет ли | представляют разные столбцы, вы хотите, чтобы результат был строкой или отдельными столбцами?
нет. '| 'заключается в разделении двух столбцов. первый столбец содержит целые числа. а второй столбец содержит строку. Но струна особенная. Он состоит из 100 целых чисел, разделенных пробелом. то есть "21 215 565 989 989 ...". Я хочу, чтобы у всех целых чисел были отдельные столбцы.






Предполагая, что ваши данные действительно выглядят так:
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
Niiiiice. Спасибо. Это то, что я искал.
Рад помочь, удачного программирования!
@Kalpit, глядя на некоторые другие опубликованные ответы, они могут быть более эффективными, поэтому вы можете выбрать один из них для использования,
Если каждая строка в этом наборе данных разделена символом новой строки, вы можете сделать что-то вроде этого:
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
Использование настройки @chrisz
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
Рассмотрим это 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
Более простой способ - использовать аргумент 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
Предполагая, что ввод находится в форме строки, мы можем сделать
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)
Это должно дать вам желаемый результат. Поскольку заменить панд создан поверх стандартного python re.sub, эта информация должна вам подойти.
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
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
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
Как набор данных представлен в памяти? Это массив?