如何转换数据集
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
答案 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
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
答案 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之上制作的,因此这些信息应该适合您。