如何将带有字符串作为行的pandas数据转换为该字符串中的每个单词作为同一列中的行?

时间:2018-02-18 08:02:25

标签: python string pandas

如何将带有字符串作为行的pandas数据转换为该字符串中的每个单词作为同一列中的行?

例如:

0 I love python
1 I hate programming

0 I
1 love
2 python 
3 I
4 hate
5 programming

3 个答案:

答案 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