Преобразовать значения регулярных выражений в пандах в 0 или 1 - PullRequest
0 голосов
/ 24 июня 2018

У меня ниже столбец панд. Мне нужно преобразовать ячейки, содержащие слово «анафилаксия», в 1, а ячейки, не содержащие слова, - 0.

До сих пор я пробовал, но чего-то не хватает

df['Name']= df['Name'].replace(r"^(.(?=anaphylaxis))*?$", 1,regex=True)
df['Name']= df['Name'].replace(r"^(.(?<!anaphylaxis))*?$", 0, regex=True)


ID             Name
84      Drug-induced anaphylaxis
1041    Acute anaphylaxis
1194    Anaphylactic reaction
1483    Anaphylactic reaction, due to adverse effect o...
2226    Anaphylaxis, initial encounter
2428    Anaphylaxis
2831    Anaphylactic shock
4900    Other anaphylactic reaction

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Используйте str.contains для сопоставления без учета регистра.

import re
df['Name'] = df['Name'].str.contains(r'anaphylaxis', flags=re.IGNORECASE).astype(int)

Или, точнее,

df['Name'] = df['Name'].str.contains(r'(?i)anaphylaxis').astype(int)

df
     ID  Name
0    84     1
1  1041     1
2  1194     0
3  1483     0
4  2226     1
5  2428     1
6  2831     0
7  4900     0

contains полезно, если вы хотите также выполнить сопоставление на основе регулярных выражений. Хотя в этом случае вы, вероятно, можете полностью избавиться от регулярных выражений, добавив regex=False для повышения производительности.


Однако, чтобы повысить производительность * , используйте понимание списка.

df['Name'] = np.array(['anaphylaxis' in x.lower() for x in df['Name']], dtype=int)

или даже лучше,

df['Name'] = [1 if 'anaphylaxis' in x.lower() else 0 for x in df['Name'].tolist()]

df

     ID  Name
0    84     1
1  1041     1
2  1194     0
3  1483     0
4  2226     1
5  2428     1
6  2831     0
7  4900     0
0 голосов
/ 24 июня 2018

Вы можете использовать pd.Series.str.contains вместо регулярных выражений. Этот метод возвращает логический ряд, который мы затем конвертируем в int.

df['Name']= df['Name'].str.contains('anaphylaxis', case=False, regex=False)\
                      .astype(int)

Результат:

     ID  Name
0    84     1
1  1041     1
2  1194     0
3  1483     0
4  2226     1
5  2428     1
6  2831     0
7  4900     0
...