将由空格分隔的一列值拆分为python中每个值的单独列

时间:2018-05-22 16:25:37

标签: python pandas split data-cleaning

如何转换数据集

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 :(得分:3)

使用@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

答案 1 :(得分:3)

更简单的方法是使用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

答案 2 :(得分:2)

假设您的数据真的如此:

  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

答案 3 :(得分:2)

考虑这个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

您可以使用str.split在col2上拆分整数。您可以手动分配结果列或使用范围,如下所示。我使用了你在评论中提到的范围示例,你正在查看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

答案 4 :(得分:1)

最紧凑

profile

忽略现有列1

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

忽略现有列2

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

答案 5 :(得分:0)

如果该数据集上的每一行都由换行符分隔,则可以执行以下操作:

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

答案 6 :(得分:0)

假设输入是字符串形式,我们可以

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之上制作的,因此这些信息应该适合您。