如何将带有字符串作为行的pandas数据转换为该字符串中的每个单词作为同一列中的行?
例如:
0 I love python
1 I hate programming
到
0 I
1 love
2 python
3 I
4 hate
5 programming
答案 0 :(得分:4)
加入空间系列并再次拆分:
pd.Series(' '.join(s).split())
0 I
1 love
2 python
3 I
4 hate
5 programming
dtype: object
或者,您可以使用pd.Series.str.cat
来完成联接
pd.Series(s.str.cat(sep=' ').split())
0 I
1 love
2 python
3 I
4 hate
5 programming
dtype: object
答案 1 :(得分:4)
在空格上拆分,然后拨打stack
:
s.str.split(expand=True).stack().reset_index(drop=True)
0 I
1 love
2 python
3 I
4 hate
5 programming
dtype: object
使用np.chararray.split
/ str.split
+ itertools.chain
提供另一个选项:
from itertools import chain
pd.Series(list(
chain.from_iterable(np.chararray.split(s.values.astype(str), sep=' ').tolist())
))
或者,
pd.Series(list(itertools.chain.from_iterable(s.str.split().tolist()))
0 I
1 love
2 python
3 I
4 hate
5 programming
dtype: object
<强>计时强>
认为这对时间来说很有趣,有很多选择。首先,设置:
s = pd.concat([s] * 10000, ignore_index=True)
现在,时间:
# in this answer
%timeit s.str.split(expand=True).stack().reset_index(drop=True)
87.6 ms ± 2.43 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%%timeit
pd.Series(list(
chain.from_iterable(np.chararray.split(s.values.astype(str), sep=' ').tolist())
))
38.1 ms ± 342 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit pd.Series(list(itertools.chain.from_iterable(s.str.split().tolist()))
24.9 ms ± 124 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# jezrael
%timeit np.concatenate(s.str.split().values)
88.2 ms ± 1.8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit pd.Series([item for sublist in s.str.split() for item in sublist])
27.5 ms ± 590 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# piRSquared
%timeit pd.Series(' '.join(s).split())
7.33 ms ± 234 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit pd.Series(s.str.cat(sep=' ').split())
8.93 ms ± 106 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
piR的答案是明显的赢家! Python的字符串操作在这里非常快,因为它们以C速度运行。
答案 2 :(得分:3)
list
的第一个split
值,然后是flatenning:
df = pd.DataFrame({'col':np.concatenate(df['col'].str.split().values)})
df = pd.DataFrame({'col': [item for sublist in df['col'].str.split() for item in sublist]})
print (df)
col
0 I
1 love
2 python
3 I
4 hate
5 programming