我的数据框有一些包含数字和单词的列。在数字和单词之前,有时会有特殊字符,例如“> *”。 该列主要分为或。基于分隔符,我想将其分为新列并删除。
使用我的代码复制了我的数据框:
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'^[>*:]*(.*?)(?:[,|\\](.*))?$')
答案 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);
列中仅添加test
或123
来添加这些值,那么也许我们只需要稍微修改一下原始表达式即可:>
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)
jex.im可视化正则表达式: