熊猫由最后一个分隔符分割

时间:2018-06-22 17:49:08

标签: python pandas dataframe split delimiter

我在数据框中具有不同输出的以下列”

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

我想始终使用split函数通过最后一个管道将列拆分,如下所示:

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

1 个答案:

答案 0 :(得分:4)

使用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

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)