Я составляю несколько отчетов. Я использовал регулярное выражение для извлечения подстроки из уникального идентификатора на основе этого приятного ответа здесь Как извлечь определенное содержимое 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
, что он должен вести себя вот так?