Как использовать строку pandas (str.contain) в цикле? - PullRequest
0 голосов
/ 08 мая 2018

У меня есть pandas df со столбцом A, который представляет собой строку строк.Каждый элемент в серии (т. Е. Каждая строка в базе данных) представляет собой одну длинную строку, разделенную запятыми.Я хотел бы создать новый столбец с именем B, который постепенно учитывает каждый раз, когда объект из отдельного списка появляется в каждой строке столбца A. Например:

мой список выглядит следующим образом:

list = ('dog', 'bird', 'cat')

мой фрейм данных выглядит следующим образом:

A                           B
dog, bird                   2
cat, bird                   2
dog, snake                  1
cat, bird, snake            2
dog, bird, cat, snake       3
dog, bird cat               3

я пытаюсь создать вложенный цикл, который выполняет следующее: начинаются с df.a [0] (то есть с первым значением df.A),узнайте, содержит ли оно первое значение в списке (то есть «собака»).Если df.A [0] содержит, то добавьте 1 к B. Затем, оставаясь в той же строке df.A, переходите ко второму значению списка (то есть «птица»).Если это значение df.A [0] также содержит это значение, добавьте еще 1 к B. и т. Д. И т. Д.

Это код, который я пытаюсь использовать.

for i in df['A']:
    for j in list:
        if i.str.contains(j):
            df['B'] += 1

Тем не менее, я продолжаю получать сообщение об ошибке:

'str' object has no attribute 'str'

Как я могу сказать пандам посмотреть всю серию, а также сказать, чтобы она функционировала как цикл со структуройопределены выше?Или как лучше решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Еще один способ добиться того, что вам нужно, задействовано get_dummies

df.A.str.get_dummies(', ').loc[:,lst].sum(1)
Out[849]: 
0    2
1    2
2    1
3    2
4    3
5    3
dtype: int64

Или мы просто делаем str.split с isin

df.A.str.split(', ',expand=True).isin(lst).sum(1)
Out[853]: 
0    2
1    2
2    1
3    2
4    3
5    3
dtype: int64
0 голосов
/ 08 мая 2018

пара заметок -

  1. Не перебирайте DataFrame, если вы можете его избежать. Всегда обращайте внимание на векторизацию. Если вы не можете, только тогда используйте понимание списка
  2. При переборе по столбцу вы перебираете отдельные строковые элементы. У них нет атрибута .str.
  3. Не используйте list и другие подобные имена (dict, tuple) для именования переменных / объектов, они затеняют встроенные. Я переименовал вашу переменную в substr ниже.

Решение KISS будет включать str.findall + str.len. Разделение не требуется.

substr = ('dog', 'bird', 'cat')
df['B'] = df['A'].str.findall('|'.join(substr)).str.len()

df['B']

0    2
1    2
2    1
3    2
4    3
5    3
Name: A, dtype: int64

Если у вас большие строки и много подстрок, вы можете захотеть использовать алгоритм Aho-Corasick .

...