Python 检查列内的字符串错误行为-熊猫
我有以下数据帧:Python 检查列内的字符串错误行为-熊猫,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据帧: import pandas as pd df = pd.DataFrame ({ 'Name':['Unable host=test1, status=c0000192','Unable host=test2, status=22228001','Unable host=test3, status=c000018d'], 'Error':['NaN','NaN','NaN'] }) print(df)
import pandas as pd
df = pd.DataFrame ({
'Name':['Unable host=test1, status=c0000192','Unable host=test2, status=22228001','Unable host=test3, status=c000018d'],
'Error':['NaN','NaN','NaN']
})
print(df)
Name Error
0 Unable host=test1, status=c0000192 NaN
1 Unable host=test2, status=22228001 NaN
2 Unable host=test3, status=c000018d NaN
代码应遵循以下if语句:
import pandas as pd
df = pd.DataFrame ({
'Name':['Unable host=test1, status=c0000192','Unable host=test2, status=22228001','Unable host=test3, status=c000018d'],
'Error':['NaN','NaN','NaN']
})
if df['Name'].str.contains('status=c000018d').any():
df['Error'] = 'Trust Failure'
elif df['Name'].str.contains('status=22228001').any():
df['Error'] = 'No creds'
else:
df['Error'] = 'Other'
print(df)
输出应为:
Name Error
0 Unable host=test1, status=c0000192 Other
1 Unable host=test2, status=22228001 No creds
2 Unable host=test3, status=c000018d Trust Failure
相反,我得到:
Name Error
0 Unable host=test1, status=c0000192 Trust Failure
1 Unable host=test2, status=22228001 Trust Failure
2 Unable host=test3, status=c000018d Trust Failure
为什么会这样?就像第一个if语句匹配所有内容一样。我认为您在这里混合了内容,请尝试以下方法:
df.loc[df['Name'].str.contains('status=c000018d'), 'Error'] = 'Trust Failure'
df.loc[df['Name'].str.contains('status=22228001'), 'Error'] = 'No creds'
df.loc[df['Name'] == 'NaN', 'Error'] = 'Other'
您正在执行的操作在第一条if语句中返回true,并用“信任失败”填充所有值。适合此问题,这是一种针对多条件列的向量化方法:
conditions = [df['Name'].str.contains('status=c000018d'),
df['Name'].str.contains('status=22228001')]
df['Error'] = np.select(conditions, choices=['Trust Failure', 'No creds'], default='Other')
Name Error
0 Unable host=test1, status=c0000192 Other
1 Unable host=test2, status=22228001 No creds
2 Unable host=test3, status=c000018d Trust Failure
您的问题是如何使用
any()
它正在按预期工作。非常感谢!很好的解决方案,我不知道np.select是否适合这种情况