pandas 去年12月,

enyaitl3  于 6个月前  发布在  其他
关注(0)|答案(1)|浏览(49)

我在一个具有不同输出的嵌套框架中有以下列:

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

字符串
我想使用split函数来分割列的最后一个管道总是这样:

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

pgvzfuti

pgvzfuti1#

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

df['col1'].str.rsplit('|', n=1, expand=True).rename(columns=lambda x: f'col{x + 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


PS:是的,第二个解决方案更快:

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

%timeit df['col1'].str.rsplit('|', n=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)

相关问题