Python 熊猫:如何在包含特殊分隔符的新列上提取列?

Python 熊猫:如何在包含特殊分隔符的新列上提取列?,python,regex,pandas,dataframe,Python,Regex,Pandas,Dataframe,我的数据框有一些包含数字和单词的列。在数字和单词之前,有时会出现特殊字符,如“>*”。 该列主要分为或/。基于分隔符,我想把它分成新的列并删除它 复制我的数据帧并使用我的代码: d={'error':[ “测试,121”, '123', “测试,测试”, “>errrI1GB,213”, “*errrI1GB,213”, “*errrI1GB/213”, “*>errrI1GB/213”, “>*errrI1GB,213”, “>测试,测试”, “>>测试,测试”, '>>:测试,测试',

我的数据框有一些包含数字和单词的列。在数字和单词之前,有时会出现特殊字符,如“>*”。 该列主要分为或/。基于分隔符,我想把它分成新的列并删除它

复制我的数据帧并使用我的代码:

d={'error':[
“测试,121”,
'123',   
“测试,测试”,
“>errrI1GB,213”,
“*errrI1GB,213”,
“*errrI1GB/213”,
“*>errrI1GB/213”,
“>*errrI1GB,213”,
“>测试,测试”,
“>>测试,测试”,
'>>:测试,测试',
]}
df=pd.DataFrame(数据=d)
df['error']=df['error'].str.replace('','')
df['error1','error2']=df['error'].str.extract('.*?(\w*)[,|/](\w*))
df
到目前为止,我的方法是首先使用

df['error']=df['error'].str.replace('','')

然后我在这个帮助下构建了我的正则表达式

*?(\w*)[,|/](\w*)

之后,我用以下命令删除了凌乱的列:

df.drop(列=[“error”],inplace=True)

不考虑行中的单个值。因此,我得到了一个NaN。如何将它们包含在我的正则表达式中

解决办法是:

df[['error1','error2']]=df['error'].str.extract(r'^[>*:]*(.*?(:[,|\\](.*))?$)

假设我们只想在
error1
列中添加一个
test
123
来添加这些值,那么我们可能只需要稍微修改您的原始表达式:

^.*?(\w*)\s*(?:[,|/]\s*(\w*))?\s*$
我很确定还有其他更简单的方法

试验 如果您希望探索/简化/修改该表达式,将在的右上面板中对其进行解释。在中,如果您愿意,可以查看它与一些示例输入的匹配情况

输出 正则表达式电路 可视化正则表达式:


那么您需要什么帮助呢?你似乎得到了你想要的…@Abbas抱歉更新了我的问题
import pandas as pd

d = {'error': [ 
'test,121',
'123',   
'test',   
'test,test',
'>errrI1GB,213',
'*errrI1GB,213',
'*errrI1GB/213',
'*>errrI1GB/213',
'>*errrI1GB,213',
'>test,   test',
'>>test,   test',
'>>:test,test',
]}
df = pd.DataFrame(data=d)

df['error1'] = df['error'].str.replace(r'(?mi)^.*?(\w*)\s*(?:[,|/]\s*(\w*))?\s*$', r'\1')
df['error2'] = df['error'].str.replace(r'(?mi)^.*?(\w*)\s*(?:[,|/]\s*(\w*))?\s*$', r'\2')

print(df)
             error    error1 error2
0         test,121      test    121
1              123       123       
2             test      test       
3        test,test      test   test
4    >errrI1GB,213  errrI1GB    213
5    *errrI1GB,213  errrI1GB    213
6    *errrI1GB/213  errrI1GB    213
7   *>errrI1GB/213  errrI1GB    213
8   >*errrI1GB,213  errrI1GB    213
9    >test,   test      test   test
10  >>test,   test      test   test
11    >>:test,test      test   test