pandas 按最后一个分隔符拆分
pandas split by last delimiter
我在具有不同输出的数据框中有以下列
col1
MLB|NBA|NFL
MLB|NBA
NFL|NHL|NBA|MLB
我想使用拆分函数通过最后一个管道拆分列,总是这样:
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)
如果以上抛出一个 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
还有更快的 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
P.S.,是的,第二种方案更快:
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)
我在具有不同输出的数据框中有以下列
col1
MLB|NBA|NFL
MLB|NBA
NFL|NHL|NBA|MLB
我想使用拆分函数通过最后一个管道拆分列,总是这样:
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)
如果以上抛出一个 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
还有更快的 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
P.S.,是的,第二种方案更快:
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)