Я пытаюсь определить, содержит ли столбец Blaze[Info]
в тексте строку из списка (и создать новый логический столбец с этой информацией).
DataFrame выглядит так:
Word Info
0 Aam Aam, n. Etym: [D. aam, fr. LL. ama; cf. L. ham...
1 aard-vark Aard"-vark`, n. Etym: [D., earth-pig.] (Zoöl.)
2 aard-wolf Aard"-wolf`, n. Etym: [D, earth-wolf] (Zoöl.)
Когда я прямо указываю термин, я получаю ответ, который хочу:
Blaze['Noun'] = np.where((Blaze['Info'].str.contains('n.')),True,False)
Blaze['Verb'] = np.where((Blaze['Info'].str.contains('v.')),True,False)
Word Info Noun Verb
0 Aam Aam, n. Etym: [D. aam, fr. LL. ama; cf. L. ham... True False
1 aard-vark Aard"-vark`, n. Etym: [D., earth-pig.] (Zoöl.) True False
2 aard-wolf Aard"-wolf`, n. Etym: [D, earth-wolf] (Zoöl.) True False
но это не масштабируется, так как у меня есть более 100 функций для поиска.
Когда я перебираю список abbreviation
:
abbreviation=['n'., 'v.']
col_name=['Noun','Verb']
for i in range(len(abbreviation)):
Blaze[col_name[i]] = np.where((Blaze['Info'].str.contains(abbreviation[i])), True, False)
Мне возвращается DataFrame, полный записей «FALSE»:
Word Info Noun Verb
0 Aam Aam, n. Etym: [D. aam, fr. LL. ama; cf. L. ham... False False
1 aard-vark Aard"-vark`, n. Etym: [D., earth-pig.] (Zoöl.) False False
2 aard-wolf Aard"-wolf`, n. Etym: [D, earth-wolf] (Zoöl.) False False
Я вижу несколько ответов, чтобы сделать что-то подобное, но сгруппировать ответ в одну строку: Проверить, содержит ли каждая строка в серии панд строку из списка, используя команду apply?
Масштабируемое решение для str.contains со списком строк в пандах
но я не думаю, что это решает вышеизложенное.
Кто-нибудь может объяснить, как я ошибаюсь?
Вы можете просматривать списки одновременно с zip
. Обязательно передайте regex=False
в str.contains
, так как .
является символом регулярного выражения.
abbreviation=['n.', 'v.']
col_name=['Noun','Verb']
for a, col in zip(abbreviation, col_name):
Blaze[col] = np.where(Blaze['Info'].str.contains(a, regex=False),True,False)
Blaze
Out[1]:
Word Info Noun Verb
0 Aam Aam, n. Etym: [D. aam, fr. LL. ama; cf. L. ham... True False
1 aard-vark Aard"-vark`, n. Etym: [D., earth-pig.] (Zoöl.) True False
2 aard-wolf Aard"-wolf`, n. Etym: [D, earth-wolf] (Zoöl.) True False
При необходимости str.contains
также имеет параметр case
, поэтому вы можете указать case=False
для поиска без учета регистра.
Ваш код работает для меня - единственное, что вам нужно сделать, это передать
regex=False
a s.
- это символ регулярного выражения, означающий, что вторая строка будетTrue
, поскольку в ней естьz
. Нет ничего плохого в том, как вы выполняете цикл, но я думаю, что мой способ может быть немного более питоническим.