Pandas中类似于str.join的等效方法是什么?

3

有没有一种干净的方法来连接任意数量的字符串系列,类似于' '.join的用法?如果我事先知道我想要的列,我可以这样做:

import pandas as pd
df = pd.DataFrame([['word1','word2', 'word3']])
df[0] + ' ' + df[1] + ' ' + df[2]

0    word1 word2 word3

然而,我不知道如何将这个方法推广到任意列的列表。我想到的最好方法是:

cols = [0,1,2]
df[cols[0]].str.cat(df[cols[1:]].values.transpose(), sep = ' ')
0    word1 word2 word3

但我有点讨厌这个解决方案。也许可以使用重载+的方式来实现?

2个回答

3
如果您不介意行尾的空格,您可以使用sum比手动输入df[0] + ' ' + df[1] + ' ' + df[2]快一些。
In [25]: (df + ' ').sum(axis=1)
Out[25]:
0    word1 word2 word3
dtype: object

然而,如果您需要去掉最后一个空格,则速度会变慢:

In [26]: (df + ' ').sum(axis=1).str.strip()
Out[26]:
0    word1 word2 word3
dtype: object   

时间:

In [34]: %timeit (df + ' ').sum(axis=1)
1000 loops, best of 3: 368 us per loop

In [38]: %timeit df[0] + ' ' + df[1] + ' ' + df[2]
1000 loops, best of 3: 482 us per loop

In [40]: %timeit (df + ' ').sum(axis=1).str.strip()
1000 loops, best of 3: 556 us per loop

In [47]: %timeit df[cols[0]].str.cat(df[cols[1:]].values.transpose(), sep = ' ')
1000 loops, best of 3: 870 us per loop

In [49]: %timeit df[[0,1,2]].apply(' '.join, axis=1)
1000 loops, best of 3: 937 us per loop

这太好了,谢谢 Anton。最后多一个空格我确实不在意,因为这将输入到分词器中,它会处理所有的问题。 - maxymoo

1

在选择列之后,您可以沿着axis=1应用操作(这里我将手动指定列,但您也可以使用cols):

>>> df = pd.DataFrame([['word1','word2', 'word3']])
>>> df
       0      1      2
0  word1  word2  word3
>>> df[[0,1,2]].apply(' '.join, axis=1)
0    word1 word2 word3
dtype: object

这是一个优雅的解决方案,不幸的是它比使用向量化的+操作慢10-100倍,有没有办法使用向量化操作? - maxymoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接