首页 > 解决方案 > 在DataFrame中多次拆分字符串

问题描述

我在 DataFrame 中有一个列,其中包含一个字符串,我必须通过不同的分隔符从中检索两条信息:

ID  STR
280 11040402-38.58551%;11050101-9.29086%;11070101-52.12363%
351 11130203-35%;11130230-65%
510 11070103-69%
655 11090103-41.63463%;11160102-58.36537%
666 11130205-50.00%;11130207-50%

我一直在尝试将.apply本系列中的方法与 lambda 函数一起使用来一次性进行拆分,但无济于事:

df['STR'].apply(lambda x: y.split('-') for y in x.split(';'))

理想情况下,我不仅可以一次性拆分字符串,还可以将左侧-与右侧分开:

ID  STR.LEFT                       STR.RIGHT
280 [11040402, 11050101, 11070101] [38.58551%, 9.29086%, 52.12363%]
351 [11130203, 11130230]           [35%, 65%]
510 [11070103]                     [69%]
655 [11090103, 11160102]           [41.63463%, 58.36537%]
666 [11130205, 11130207]           [50.00%, 50%]

我相信这可以通过.apply切片来实现,但欢迎任何其他解决方案。

标签: pythonpandaslistdataframelambda

解决方案


您可以尝试拆分多次:

# set ID as index
df.set_index('ID', inplace=True)


new_series = df.STR.str.split(';', expand=True).stack().reset_index(level=-1,drop=True)

new_df = new_series.str.split('-', expand=True)

new_df.groupby('ID').agg(list).reset_index()

输出:

      ID  0                                     1
--  ----  ------------------------------------  --------------------------------------
 0   280  ['11040402', '11050101', '11070101']  ['38.58551%', '9.29086%', '52.12363%']
 1   351  ['11130203', '11130230']              ['35%', '65%']
 2   510  ['11070103']                          ['69%']
 3   655  ['11090103', '11160102']              ['41.63463%', '58.36537%']
 4   666  ['11130205', '11130207']              ['50.00%', '50%']

推荐阅读