Python 按最后一个分隔符分割的熊猫
我在具有不同输出的数据帧中有以下列“ 我想使用split函数按最后一根管道拆分柱,因此如下所示: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) 如果上面的代码给您带来了一个
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)