将Pandas Series按子字符串拆分成多列

3

我试图使用正则表达式将DataFrame系列分割成多个列。

可复现的代码:

pd.DataFrame({"Animals":["(Cat1, Dog1)", "(Cat1, Dog2)", "(Cat1, Dog3)", "(Cat2, Dog1)", "(Cat2, Dog2)", "(Cat2, Dog3)"]})

输入表格:

enter image description here

期望表格:

enter image description here

提前感谢!

3个回答

3

编辑:

根据评论,Shubham的解决方案最为简洁:

df[['Animals1', 'Animals2']] = df['Animals'].str.extract(r'(\w+), (\w+)')

您也可以使用 replace 方法来去除括号和空格,并使用 split(',') 方法,同时设置参数 expand=True 来创建新的列:

df[['Animal1', 'Animal2']] = (df['Animals'].replace(['\(', '\)', '\s+'], '', regex=True)
                              .str.split(',', expand=True))
df
Out[1]: 
        Animals  Animal1  Animal2
0  (Cat1, Dog1)     Cat1     Dog1
1  (Cat1, Dog2)     Cat1     Dog2
2  (Cat1, Dog3)     Cat1     Dog3
3  (Cat2, Dog1)     Cat2     Dog1
4  (Cat2, Dog2)     Cat2     Dog2
5  (Cat2, Dog3)     Cat2     Dog3

1
试试 extract 函数:df[['Animals1', 'Animals2']] = df['Animals'].str.extract(r'(\w+), (\w+)') ;) - Shubham Sharma
@ShubhamSharma 谢谢!我没想到你可以同时提取两列。我本来打算使用 extract() 但是分成两行。我猜,指定多个捕获组才使这成为可能。 - David Erickson
1
从技术上讲,只要在“正则表达式”模式中有相等数量的捕获组,我们就可以提取任意数量的列。 - Shubham Sharma
是的,这是一个更干净的解决方案。请随意发布它。很多人使用str.extract(),但我实际上从未亲眼见过它被用在你所使用的方式上。 - David Erickson
1
请随意编辑您的帖子,加入str.extract作为另一种解决方案。 - Shubham Sharma

3

尝试:

df[['Animal1', 'Animal2']] = df['Animals'].str[1:-1].str.split(', ', expand=True)

    Animals         Animal1 Animal2
0   (Cat1, Dog1)    Cat1    Dog1
1   (Cat1, Dog2)    Cat1    Dog2
2   (Cat1, Dog3)    Cat1    Dog3
3   (Cat2, Dog1)    Cat2    Dog1
4   (Cat2, Dog2)    Cat2    Dog2
5   (Cat2, Dog3)    Cat2    Dog3

1
谢谢。在我的个人pandas系列中,我有一些括号前的子字符串,因此与使用正则表达式捕获组相比,[1:-1]切片不够动态。尽管如此,我在问题中没有具体说明,所以还是谢谢! - Tony Ng

2

一种方法是:

df = pd.DataFrame({"Animals":["(Cat1, Dog1)", "(Cat1, Dog2)", "(Cat1, Dog3)", "(Cat2, Dog1)", "(Cat2, Dog2)", "(Cat2, Dog3)"]})
df['Animal1'] = df['Animals'].map(lambda x: x.split(', ')[0][1:])
df['Animal2'] = df['Animals'].map(lambda x: x.split(', ')[1][:-1])

1
谢谢,与正则表达式相比,拆分方法略显不够灵活和强大,因为它仍保留了括号符号,并且不能像正则表达式那样准确地捕获组。尽管如此,我还是很感谢你提出这个问题。 - Tony Ng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接