Python 按最后一个分隔符分割的熊猫

Python 按最后一个分隔符分割的熊猫,python,pandas,dataframe,split,delimiter,Python,Pandas,Dataframe,Split,Delimiter,我在具有不同输出的数据帧中有以下列“ 我想使用split函数按最后一根管道拆分柱,因此如下所示: col1 col2 MLB|NBA NFL MLB NBA NFL|NHL|NBA MLB 使用Series.str.rsplit,限制拆分的数量 df.col1.str.rsplit('|', 1, expand=True).rename(lambda x: f'col{x + 1}', axis=1) 如果上面的代码给您带来了一个

我在具有不同输出的数据帧中有以下列“

我想使用split函数按最后一根管道拆分柱,因此如下所示:

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

使用
Series.str.rsplit
,限制拆分的数量

df.col1.str.rsplit('|', 1, expand=True).rename(lambda x: f'col{x + 1}', axis=1)
如果上面的代码给您带来了一个语法错误,这意味着您使用的是比3.6旧的python版本(真丢脸!)。请改用

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

还有更快的loopy
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看到我的编辑了吗?根据以前的经验,大多数熊猫str函数都是f或者说是方便,而不是性能。但这也同时构造了DF,所以它更令人震惊!感谢您的提示。DF['Label'].str.rsplit('|',1,expand=True)。重命名(lambda x:f'Label{x+1}',axis=1)这就是我所拥有的,但是我得到了一个语法错误?在x+1附近?@roganjosh这是你的CPython。熊猫内部的所有这些层次的开销才是真正的罪魁祸首。
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)