Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 8, 2018 02:40:15

Belg
Зарегистрирован: 2018-03-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

Срочно!


 i=0
while i<=49087:
    k=x.r1_hero_roles[i]
    if 'Nuker' in k:
        x['radiant_Nukers'][i]=x['radiant_Nukers'][i]+1
    i=i+1

Выдаёт ошибку:

C:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:5: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
“”"

Вычитал, что это не ошибка, а предупреждение и его можно отключить командой:

 pd.options.mode.chained_assignment = None

Отключил, предупреждение больше не вылазит, но проект как зависал раньше, обрабатывая что-то, так и зависает сейчас. Может, это из-за вайл’а, который должен выполняться 49 тысяч раз? Хотя, сомневаюсь.

Дедлайн через 4 дня, хелп! Заранее спасибо.

Отредактировано Belg (Апрель 8, 2018 02:42:08)

Офлайн

#2 Апрель 8, 2018 06:37:12

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

Belg
Вычитал, что это не ошибка, а предупреждение и его можно отключить командой:
Его не надо отключать, надо исправить сам код, чтобы оно не выводилось. Он говорит, что там взята копия объекта, а не сам объект. Поэтому, когда ты пытаешься поменять сам объект, он остаётся неизменным, потому что ты меняешь только временную копию.

Вместо
  
x['radiant_Nukers'][i]
используется
  
x.loc[:,('radiant_Nukers',i)]
из-за цепочного индексирования.



Отредактировано py.user.next (Апрель 8, 2018 06:41:57)

Офлайн

#3 Апрель 8, 2018 13:16:46

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

Скорее всего, ваш цикл while можно заменить, используя векторные операции в pandas, как-то так:

 # x -- is a pandas data frame;
# Select all rows, where r1_hero_roles contains Nuker, and increment corresponding radiant_Nukers values;
x.loc[x.r1_hero_roles.str.contains("Nuker"),'radiant_Nukers'] += 1
# not tested... 

Офлайн

#4 Апрель 8, 2018 13:19:42

Belg
Зарегистрирован: 2018-03-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

py.user.next
Его не надо отключать, надо исправить сам код

Спасибо. А как именно его исправить? Просто искренне не представляю, зачем он берёт какие-то копии, фактически, он должен проверить 49 тысяч ячеек в столбце excel-таблицы, и если условие выполняется, то в изменить значение соседней ячейки, понятное дело, в той же строчке, что и ячейка с условием.
P.S. На старом-добром visual basic не раз подобный код, но в данный момент необходим питон, а я в нём не в зуб ногой, hello world неделю назад написал

Отредактировано Belg (Апрель 8, 2018 13:21:17)

Офлайн

#5 Апрель 8, 2018 14:35:24

Belg
Зарегистрирован: 2018-03-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

scidam
Скорее всего, ваш цикл while можно заменить, используя векторные операции в pandas, как-то так:
Возникает такая лютая ошибка:

KeyError Traceback (most recent call last)
<ipython-input-80-2dce6c1f2299> in <module>()
—-> 1 x.loc += 1

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py in __getitem__(self, key)
1365 except (KeyError, IndexError):
1366 pass
-> 1367 return self._getitem_tuple(key)
1368 else:
1369 # we by definition only have the 0th axis

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py in _getitem_tuple(self, tup)
856 def _getitem_tuple(self, tup):
857 try:
–> 858 return self._getitem_lowerdim(tup)
859 except IndexingError:
860 pass

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py in _getitem_lowerdim(self, tup)
1018 return section
1019 # This is an elided recursive call to iloc/loc/etc'
-> 1020 return getattr(section, self.name)
1021
1022 raise IndexingError('not applicable')

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py in __getitem__(self, key)
1371
1372 maybe_callable = com._apply_if_callable(key, self.obj)
-> 1373 return self._getitem_axis(maybe_callable, axis=axis)
1374
1375 def _is_scalar_access(self, key):

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py in _getitem_axis(self, key, axis)
1614 raise ValueError('Cannot index with multidimensional key')
1615
-> 1616 return self._getitem_iterable(key, axis=axis)
1617
1618 # nested tuple slicing

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py in _getitem_iterable(self, key, axis)
1113
1114 if self._should_validate_iterable(axis):
-> 1115 self._has_valid_type(key, axis)
1116
1117 labels = self.obj._get_axis(axis)

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py in _has_valid_type(self, key, axis)
1470 raise KeyError(
1471 u"None of are in the ".format(
-> 1472 key=key, axis=self.obj._get_axis_name(axis)))
1473 else:
1474

KeyError: ‘None of fight_id\n0 NaN\n1 NaN\n2 NaN\n3 NaN\n4 NaN\n5 NaN\n6 NaN\n7 NaN\n8 NaN\n9 NaN\n10 NaN\n11 NaN\n12 NaN\n13 NaN\n14 NaN\n15 NaN\n16 NaN\n17 NaN\n18 NaN\n19 NaN\n20 NaN\n21 NaN\n22 NaN\n23 NaN\n24 NaN\n25 NaN\n26 NaN\n27 NaN\n28 NaN\n29 NaN\n ..\n49058 NaN\n49059 NaN\n49060 NaN\n49061 NaN\n49062 NaN\n49063 NaN\n49064 NaN\n49065 NaN\n49066 NaN\n49067 NaN\n49068 NaN\n49069 NaN\n49070 NaN\n49071 NaN\n49072 NaN\n49073 NaN\n49074 NaN\n49075 NaN\n49076 NaN\n49077 NaN\n49078 NaN\n49079 NaN\n49080 NaN\n49081 NaN\n49082 NaN\n49083 NaN\n49084 NaN\n49085 NaN\n49086 NaN\n49087 NaN\nName: r1_hero_roles, Length: 49088, dtype: float64 are in the index’

Отредактировано Belg (Апрель 8, 2018 14:47:41)

Офлайн

#6 Апрель 8, 2018 14:39:52

Petr35
Зарегистрирован: 2018-02-07
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

 x=1
while True:
      print(x)
      x=x+1

Офлайн

#7 Апрель 8, 2018 15:01:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

Belg
А как именно его исправить?
Все места с двойным индексированием замени на форму с loc. Там же в сообщении показано.

Belg
На старом-добром visual basic не раз подобный код
pandas - это сторонний модуль. Там свои разработчики, у них своё восприятие того, что и как должно быть. К самому питону это не относится.

Belg
фактически, он должен проверить 49 тысяч ячеек в столбце excel-таблицы, и если условие выполняется, то в изменить значение соседней ячейки
Надо описать задание, потому что ты его вообще можешь неправильно делать. То есть решение этой проблемы может быть и не нужным вообще, может быть неправильным путём решения самой задачи.



Отредактировано py.user.next (Апрель 8, 2018 15:05:18)

Офлайн

#8 Апрель 8, 2018 15:16:16

Belg
Зарегистрирован: 2018-03-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

py.user.next

Так?

 if 'Nuker' in k:
        x.loc[:,('radiant_Nukers',i)]=x.loc[:,('radiant_Nukers',i)]+1

Теперь говорит:

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py:858: FutureWarning:
Passing list-likes to .loc or with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike
return self._getitem_lowerdim(tup)

KeyError Traceback (most recent call last)
<ipython-input-88-6f2334ee5994> in <module>()
3 k=x.r1_hero_roles
4 if ‘Nuker’ in k:
—-> 5 x.loc=x.loc+1
6 if ‘Carry’ in k:
7 x.loc=x.loc+1

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py in __setitem__(self, key, value)
191 else:
192 key = com._apply_if_callable(key, self.obj)
–> 193 indexer = self._get_setitem_indexer(key)
194 self._setitem_with_indexer(indexer, value)
195

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py in _get_setitem_indexer(self, key)
169 if isinstance(key, tuple):
170 try:
–> 171 return self._convert_tuple(key, is_setter=True)
172 except IndexingError:
173 pass

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py in _convert_tuple(self, key, is_setter)
240 if i >= self.obj.ndim:
241 raise IndexingError('Too many indexers')
–> 242 idx = self._convert_to_indexer(k, axis=i, is_setter=is_setter)
243 keyidx.append(idx)
244 return tuple(keyidx)

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py in _convert_to_indexer(self, obj, axis, is_setter)
1267 if mask.any():
1268 raise KeyError('{mask} not in index'
-> 1269 .format(mask=objarr))
1270
1271 return _values_from_object(indexer)

KeyError: ' not in index'

Пробовал разные начальные значения i - ничего не пашет. Я вообще правильно делаю, что это в индекс записываю? Фактически, i - номер строки в таблице, ячейки в которой надо проверить и так он должен пройтись по всей таблице.

Офлайн

#9 Апрель 8, 2018 22:09:02

Belg
Зарегистрирован: 2018-03-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

py.user.next
Надо описать задание, потому что ты его вообще можешь неправильно делать. То есть решение этой проблемы может быть и не нужным вообще, может быть неправильным путём решения самой задачи.

Если нужно описание задачи, то вот кратко:

Есть данные на 50 тысяч боёв в доте 2, надо научить модель определять победителя.

Офлайн

#10 Апрель 9, 2018 02:58:30

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.


Хорошо, вот рабочий пример. Проверяем есть ли в колонке ‘r1_hero_roles’ подстрока ‘sd’,
если есть, то увеличиваем соответствующее значение в колонке ‘radiant_Nukers’. Без циклов.

 import pandas as pd
# fake data frame... 
x = pd.DataFrame({'r1_hero_roles': pd.np.random.randint(97, 122, (50000, 10)).astype(np.uint8).view('S1').astype(np.object).sum(axis=1),
                  'radiant_Nukers': pd.np.random.randint(0, 100, 50000)})
# find all 'sd' occurences and increment radiant_Nukers column (replace 'sd' with 'Nuker')
x.loc[x['r1_hero_roles'].str.decode('utf-8').str.contains('sd'), 'radiant_Nukers'] += 1
#>>> pd.__version__
#'0.21.0'

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version