Использование индекса bool для `df.lo c ... str.extract ()` возвращает неожиданный результат - PullRequest
0 голосов
/ 02 августа 2020

Я составляю несколько отчетов. Я использовал регулярное выражение для извлечения подстроки из уникального идентификатора на основе этого приятного ответа здесь Как извлечь определенное содержимое c в фрейм данных pandas с помощью регулярного выражения? . Вот мой пример игрушки:

df1 = pd.DataFrame([['O-11111', 'fruit'], 
                   ['O-11111', 'fruit'],
                   ['O-11111', 'fruit'], 
                   ['O-11111', 'fruit'],
                   ['O-99999', 'veggie']
                  ], columns=['id', 'cat'])
df2 = pd.DataFrame([['O-99999', 'veggie'], 
                   ['O-99999', 'veggie'],
                   ['O-99999', 'veggie'], 
                   ['O-99999', 'veggie'],
                   ['O-99999', 'veggie']
                  ], columns=['id', 'cat'])
df3 = pd.concat([df1,df2])
df3['id1'] = df3.id.str.extract(r'O-([0-9]{5})')

    id      cat     id1
0   O-11111 fruit   11111
1   O-11111 fruit   11111
2   O-11111 fruit   11111
3   O-11111 fruit   11111
4   O-99999 veggie  99999
0   O-99999 veggie  99999
1   O-99999 veggie  99999
2   O-99999 veggie  99999
3   O-99999 veggie  99999
4   O-99999 veggie  99999

Позже мне нужно было добавить второй столбец на основе совпадения тегов. Я использую df.loc вместе с красивым логическим индексом:

df3.cat == 'fruit'
0     True
1     True
2     True
3     True
4    False
0    False
1    False
2    False
3    False
4    False
Name: cat, dtype: bool

Но когда я складываю две части вместе, я получаю неожиданные результаты: id_fruit имеет идентификаторы, где тег равен veggie (и они Это неправильный идентификатор).

df3['id_fruit'] = df3.loc[df3.cat == 'fruit', 'id'].str.extract(r'O-([0-9]{5})')

    id      cat     id1     id_fruit
0   O-11111 fruit   11111   11111
1   O-11111 fruit   11111   11111
2   O-11111 fruit   11111   11111
3   O-11111 fruit   11111   11111
4   O-99999 veggie  99999   NaN
0   O-99999 veggie  99999   11111
1   O-99999 veggie  99999   11111
2   O-99999 veggie  99999   11111
3   O-99999 veggie  99999   11111
4   O-99999 veggie  99999   NaN

Только после кучи отладки я замечаю образец ошибки и думаю сбросить индекс, и я получаю ожидаемый результат.

df3.reset_index(drop=True, inplace=True)
df3['id2_fruit'] = df3.loc[df3.cat == 'fruit', 'id'].str.extract(r'O-([0-9]{5})')

    id      cat     id1     id_fruit  id2_fruit
0   O-11111 fruit   11111   11111     11111
1   O-11111 fruit   11111   11111     11111
2   O-11111 fruit   11111   11111     11111
3   O-11111 fruit   11111   11111     11111
4   O-99999 veggie  99999   NaN       NaN
5   O-99999 veggie  99999   11111     NaN
6   O-99999 veggie  99999   11111     NaN
7   O-99999 veggie  99999   11111     NaN
8   O-99999 veggie  99999   11111     NaN
9   O-99999 veggie  99999   NaN       NaN

Я думаю, что логический индекс должен быть единственным совпадающим элементом. Что я не понимаю в использовании df.loc, что он должен вести себя вот так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...