将 space 分隔的一列值拆分为 python 中每个值的单独列

Split a column of values delimited by a space into separate columns for each value in python

如何转换数据集

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

假设您的数据真的是这样的:

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

joinfindall

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

如果该数据集上的每一行都由换行符分隔,您可以这样做:

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

您可以使用 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

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

这应该会为您提供所需的输出。由于 pandas' replace 是在标准 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

忽略现有列 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