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

时间:2019-07-20 10:31:49

标签: python regex pandas dataframe

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

使用我的代码复制了我的数据框:

d = {'error': [ 
'test,121',
'123',   
'test,test',
'>errrI1GB,213',
'*errrI1GB,213',
'*errrI1GB/213',
'*>errrI1GB/213',
'>*errrI1GB,213',
'>test,   test',
'>>test,   test',
'>>:test,test',
]}
df = pd.DataFrame(data=d)
df['error'] = df['error'].str.replace(' ', '')
df[['error1', 'error2']] = df['error'].str.extract('.*?(\w*)[,|/](\w*)')
df

到目前为止,我的方法是先使用

删除空格

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

在此帮助下,我构建了正则表达式  https://regex101.com/r/UHzTOq/13

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

然后,我使用以下命令删除混乱的列:

df.drop(columns =["error"], inplace = True)

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

解决方案是:

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

1 个答案:

答案 0 :(得分:1)

假设我们只想在use FacebookAds\Object\AdAccount; use FacebookAds\Api; use FacebookAds\Logger\CurlLogger; $access_token = '<ACCESS_TOKEN>'; $app_secret = '<APP_SECRET>'; $app_id = '<APP_ID>'; $id = '<AD_ACCOUNT_ID>'; $api = Api::init($app_id, $app_secret, $access_token); $api->setLogger(new CurlLogger()); $fields = array( 'name', 'tos_accepted', ); $params = array( ); echo json_encode((new AdAccount($id))->getSelf( $fields, $params )->exportAllData(), JSON_PRETTY_PRINT); 列中仅添加test123来添加这些值,那么也许我们只需要稍微修改一下原始表达式即可:

error1

我很确定还有其他更简单的方法。

测试

^.*?(\w*)\s*(?:[,|/]\s*(\w*))?\s*$

该表达式在regex101.com的右上角进行了解释,如果您想探索/简化/修改它,在this link中,您可以观察到它如何与某些示例输入匹配,如果你喜欢。

输出

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)

RegEx电路

jex.im可视化正则表达式:

enter image description here