Попытка поставить условие if else для столбца в Dataframe, но получение Keyerror - PullRequest
0 голосов
/ 30 марта 2020

Я работаю над большим набором данных. Один столбец является столбцом цены. Я пытаюсь округлить значение столбца цены с помощью следующего кода:

for i in range(0,len(df5['price'])):
    if df5['price'][i]>=0 and df5['price'][i]<=50:
        df5['price'][i] = 50
    elif df5['price'][i]>50 and df5['price'][i] <= 100:
        df5['price'][i] = 100
    elif df5['price'][i]>100 and df5['price'][i]<=150:
        df5['price'][i]=150
    elif df5['price'][i]>150 and df5['price'][i]<=200:
        df5['price'][i]=200
    elif df5['price'][i]>200 and df5['price'][i]<=250:
        df5['price'][i]=250
    elif df5['price'][i]>250 and df5['price'][i]<=300:
        df5['price'][i]=300
    elif df5['price'][i]>300 and df5['price'][i]<=350:
        df5['price'][i]=350
    elif df5['price'][i]>350 and df5['price'][i]<=400:
        df5['price'][i]=400

Но я получаю это сообщение об ошибке:

KeyError                                  Traceback (most recent call last)
<ipython-input-218-4872943ca532> in <module>
      1 for i in range(0,len(df5['price'])):
----> 2     if df5['price'][i]>=0 and df5['price'][i]<=50:
      3         df5['price'][i] = 50
      4     elif df5['price'][i]>50 and df5['price'][i] <= 100:
      5         df5['price'][i] = 100

~\Anaconda3\lib\site-packages\pandas\core\series.py in __getitem__(self, key)
    866         key = com.apply_if_callable(key, self)
    867         try:
--> 868             result = self.index.get_value(self, key)
    869 
    870             if not is_scalar(result):

~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_value(self, series, key)
   4373         try:
   4374             return self._engine.get_value(s, k,
-> 4375                                           tz=getattr(series.dtype, 'tz', None))
   4376         except KeyError as e1:
   4377             if len(self) > 0 and (self.holds_integer() or self.is_boolean()):

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

KeyError: 35

Что здесь не так? Кто-нибудь может объяснить, пожалуйста. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Если ваша цель - округлить значения в столбце price до ближайших 50, вы также можете попробовать это:

import numpy as np

df5['price'] = df5.price.apply(lambda val: np.ceil(val/50)*50)
1 голос
/ 30 марта 2020

Прежде всего, не запускайте al oop поверх pandas DataFrame, даже если это сработает, это будет мучительно медленно. Если необходимо, используйте метод pandas.DataFrame.iterrows, который намного быстрее, чем al oop, но, тем не менее, будет довольно медленным.

Для вашей проблемы, предполагая, что ведро равнорасположено, вы можете сделать что-то вроде этого:

import numpy as np

df5['price'] = (np.digitize(df5.price, np.arange(0, 450, 50)))*50

Чтобы ответить на ваш вопрос, почему вы получаете KeyError, возможно, из-за того, что ваши индексы данных отключены. Рассмотрите возможность изменения df5['price'][i] на df5['price'].iloc[i]

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