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