Проверьте строку внутри столбца неправильное поведение - Pandas - PullRequest
3 голосов
/ 30 марта 2020

У меня есть следующий фрейм данных:

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

Код должен следовать приведенным ниже инструкциям:

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, который соответствует всему.

Ответы [ 2 ]

4 голосов
/ 30 марта 2020

Я думаю, что вы смешиваете что-то здесь, попробуйте так:

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'

То, что вы делаете, возвращает true в первом операторе if и заполняет все значения значением 'Trust Failure'.

3 голосов
/ 30 марта 2020

np.select подходит для этой задачи, которая представляет собой векторизованный метод для мультиусловного столбца:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...