Pandas按最后一个分隔符拆分

4

我有一个数据框中的列,其中输出不同:

col1
MLB|NBA|NFL
MLB|NBA
NFL|NHL|NBA|MLB

我想使用split函数将该列始终按照最后一个竖杠进行拆分,就像这样:
col1           col2
MLB|NBA        NFL
MLB            NBA
NFL|NHL|NBA    MLB

哎呀,下次提问关于pandas的问题时别忘了加上pandas标签。 - cs95
我的错。我通常这样做。 - skimchi1993
1个回答

8
使用 Series.str.rsplit 方法进行字符串分割时,可以限制分割的次数。
df.col1.str.rsplit('|', 1, expand=True).rename(lambda x: f'col{x + 1}', axis=1)

如果上述代码抛出SyntaxError错误,说明你使用的是Python版本低于3.6(真丢人!)。请使用以下代码:

df.col1.str.rsplit('|', 1, expand=True)\
  .rename(columns=lambda x: 'col{}'.format(x + 1))

          col1 col2
0      MLB|NBA  NFL
1          MLB  NBA
2  NFL|NHL|NBA  MLB

还有一种更快的循环方式 str.rsplit 等价函数。
pd.DataFrame(
    [x.rsplit('|', 1) for x in df.col1.tolist()], 
    columns=['col1', 'col2']
) 
          col1 col2
0      MLB|NBA  NFL
1          MLB  NBA
2  NFL|NHL|NBA  MLB

顺便说一句,是的,第二种解决方案更快:

df = pd.concat([df] * 100000, ignore_index=True)

%timeit df.col1.str.rsplit('|', 1, expand=True)
%timeit pd.DataFrame([x.rsplit('|', 1) for x in df.col1.tolist()])

473 ms ± 13.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
128 ms ± 1.29 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

列表推导式更快吗?在我为此设置适当的测试用例之前,我假设您是根据一些先前的示例或您自己的经验而发表该观点。 - roganjosh
但这也同时构建了DF,所以更令人震惊!感谢提醒。 - roganjosh
df['Label'].str.rsplit('|', 1, expand=True).rename(lambda x: f'Label{x+1}', axis=1)这是我所拥有的,但我遇到了语法错误?是在x+1附近吗? - skimchi1993
@roganjosh 这就是CPython。实际上,Pandas内部的所有这些开销层才是罪魁祸首。 - cs95
df['Label'].str.rsplit('|', 1, expand=True)
.rename(lambda x: 'Label{}'.format(x+1), axis=1)这会抛出一个类型错误:rename()得到了一个意外的关键字参数"axis"。
- skimchi1993
显示剩余3条评论

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