pandas: ошибка при использовании метода .where()

station_stat_full['group_name'] = station_stat_full['name'].where(big_nets_stat.index.isin(station_stat_full['name']) , 'Другие')
print(station_stat_full)

ValueError: Array conditional must be same shape as self

Когда пытаюсь проверить без метода все работает

station_stat_full

name  count  time_spent
id
00ca1b70     Вероника    131       166.0
0178ce70      Василёк    164       234.5
01abf4e9      Гацания     30       181.5
030a9067  Колокольчик    228       135.5
03740f2d      Василёк    157       289.0
0410bffa        Люпин     13       136.0

...               ...    ...         ...
e648b45e     Астильба     42       465.5
e66b6d7a      Василёк    568       172.5
e6ee10ab     Астильба     83       489.0
e7d23afd   Подснежник     45       173.0
e80c9f2c      Гейхера    124       167.0


[386 rows x 3 columns]

big_nets_stat

             time_spent  good_time_spent  median_time  stations
name
Василёк      268.849897            264.0       252.00     103.0
Гейхера      167.445947            204.0       192.00      12.0
Календула    207.357323            254.0       240.00      36.0
Колокольчик  119.131564            161.0       161.00      21.0
Люпин        235.440937            186.0       200.00      13.0
Мальва       136.562234            182.0       177.75      22.0
Немезия      186.535207            226.0       227.50      21.0
Роза         260.877217            315.0       350.00      18.0

Ответы (1 шт):

Автор решения: Алексей Р

В сообщении об ошибке написано, что размер булева массива должен совпадать с размером серии. У вас же кол-во элементов big_nets_stat.index равно 7, а элементов в station_stat_full['name'] - 386. Очевидно, что результатом выражения big_nets_stat.index.isin(station_stat_full['name']) будет булев массив из 7 элементов, который вы пытаетесь "растянуть" на 386 элементов station_stat_full.

Вам нужно просто переставить серии в выражении - искать big_nets_stat.index в station_stat_full['name'].

station_stat_full = pd.DataFrame({'id': ['00ca1b70', '0178ce70', '01abf4e9', '030a9067', '03740f2d', '0410bffa', 'e648b45e', 'e66b6d7a', 'e6ee10ab', 'e7d23afd', 'e80c9f2c'],
                                  'name': ['Вероника', 'Василёк', 'Гацания', 'Колокольчик', 'Василёк', 'Люпин', 'Астильба', 'Василёк', 'Астильба', 'Подснежник', 'Гейхера'],
                                  'count': [131, 164, 30, 228, 157, 13, 42, 568, 83, 45, 124], 'time_spent': [166.0, 234.5, 181.5, 135.5, 289.0, 136.0, 465.5, 172.5, 489.0, 173.0, 167.0]})
big_nets_stat = pd.DataFrame({'name': ['Василёк', 'Гейхера', 'Календула', 'Колокольчик', 'Люпин', 'Мальва', 'Немезия', 'Роза'],
                              'time_spent': [268.849897, 167.445947, 207.357323, 119.131564, 235.440937, 136.562234, 186.535207, 260.877217],
                              'good_time_spent': [264.0, 204.0, 254.0, 161.0, 186.0, 182.0, 226.0, 315.0], 'median_time': [252.0, 192.0, 240.0, 161.0, 200.0, 177.75, 227.5, 350.0],
                              'stations': [103.0, 12.0, 36.0, 21.0, 13.0, 22.0, 21.0, 18.0]}).set_index('name')
station_stat_full['group_name'] = station_stat_full['name'].where(station_stat_full['name'].isin(big_nets_stat.index), 'Другие')
print(station_stat_full)
          id         name  count  time_spent   group_name
0   00ca1b70     Вероника    131       166.0       Другие
1   0178ce70      Василёк    164       234.5      Василёк
2   01abf4e9      Гацания     30       181.5       Другие
3   030a9067  Колокольчик    228       135.5  Колокольчик
4   03740f2d      Василёк    157       289.0      Василёк
5   0410bffa        Люпин     13       136.0        Люпин
6   e648b45e     Астильба     42       465.5       Другие
7   e66b6d7a      Василёк    568       172.5      Василёк
8   e6ee10ab     Астильба     83       489.0       Другие
9   e7d23afd   Подснежник     45       173.0       Другие
10  e80c9f2c      Гейхера    124       167.0      Гейхера
→ Ссылка