Ошибка во время преобразования столбца данных pandas в python 3

У меня большая проблема с пандами. У меня есть важный фрейм данных, содержащий

Ref_id   PRICE    YEAR  MONTH BRAND
100000   '5000'  '2012' '4'   'FORD'
100001   '10000' '2015' '5'   'MERCEDES'
...

Я хочу преобразовать свои столбцы PRICE, YEAR и MONTH, но когда я использую .astype(int) или .apply(lambda x: int(x)) в столбце, я получаю ValueError. Длина моего фрейма данных составляет 1,8 миллиона строк.

ValueError: invalid literal for int() with base 10: 'PRICE'

Поэтому я не понимаю, почему pandas хочет преобразовать имя столбца.

Не могли бы вы объяснить мне, почему?

Лучший,

C.


person Chris PERE    schedule 12.04.2017    source источник
comment
Пожалуйста, опубликуйте необработанные данные и полный код, который воспроизводит эту ошибку.   -  person EdChum    schedule 12.04.2017
comment
Извините, я не могу, мои данные и код конфиденциальны, поэтому я не могу ими поделиться. Я могу просто показать вам набор данных (тест) и ошибку.   -  person Chris PERE    schedule 12.04.2017


Ответы (1)


Попробуй это:

In [59]: cols = 'PRICE  YEAR  MONTH'.split()

In [60]: cols
Out[60]: ['PRICE', 'YEAR', 'MONTH']

In [61]: for c in cols:
    ...:     df[c] = pd.to_numeric(df[c], errors='coerce')
    ...:

In [62]: df
Out[62]:
   Ref_id    PRICE  YEAR  MONTH     BRAND
0  100000   5000.0  2012      4      FORD
1  100001  10000.0  2015      5  MERCEDES
2  100002      NaN  2016      6      AUDI

Воспроизведение вашей ошибки:

In [65]: df
Out[65]:
   Ref_id  PRICE  YEAR  MONTH     BRAND
0  100000   5000  2012      4      FORD
1  100001  10000  2015      5  MERCEDES
2  100002  PRICE  2016      6      AUDI  # pay attention at `PRICE` value !!!

In [66]: df['PRICE'].astype(int)
...
skipped
...
ValueError: invalid literal for int() with base 10: 'PRICE'

Как добавил @jezrael в этот комментарий скорее всего, у вас есть "плохие" (неожиданные) значения в вашем наборе данных.

Вы можете использовать один из следующих методов, чтобы очистить его:

In [155]: df
Out[155]:
   Ref_id  PRICE  YEAR  MONTH     BRAND
0  100000   5000  2012      4      FORD
1  100001  10000  2015      5  MERCEDES
2  Ref_id  PRICE  YEAR  MONTH     BRAND
3  100002  15000  2016      5      AUDI

In [156]: df.dtypes
Out[156]:
Ref_id    object
PRICE     object
YEAR      object
MONTH     object
BRAND     object
dtype: object

In [157]: df = df.drop(df.loc[df.PRICE == 'PRICE'].index)

In [158]: df
Out[158]:
   Ref_id  PRICE  YEAR MONTH     BRAND
0  100000   5000  2012     4      FORD
1  100001  10000  2015     5  MERCEDES
3  100002  15000  2016     5      AUDI

In [159]: for c in cols:
     ...:     df[c] = pd.to_numeric(df[c], errors='coerce')
     ...:

In [160]: df
Out[160]:
   Ref_id  PRICE  YEAR  MONTH     BRAND
0  100000   5000  2012      4      FORD
1  100001  10000  2015      5  MERCEDES
3  100002  15000  2016      5      AUDI

In [161]: df.dtypes
Out[161]:
Ref_id    object
PRICE      int64
YEAR       int64
MONTH      int64
BRAND     object
dtype: object

или просто:

In [159]: for c in cols:
     ...:     df[c] = pd.to_numeric(df[c], errors='coerce')
     ...:

In [165]: df
Out[165]:
   Ref_id    PRICE    YEAR  MONTH     BRAND
0  100000   5000.0  2012.0    4.0      FORD
1  100001  10000.0  2015.0    5.0  MERCEDES
2  Ref_id      NaN     NaN    NaN     BRAND
3  100002  15000.0  2016.0    5.0      AUDI

а затем .dropna(how='any'), если вы знаете, что в исходном наборе данных не было NaN:

In [166]: df = df.dropna(how='any')

In [167]: df
Out[167]:
   Ref_id    PRICE    YEAR  MONTH     BRAND
0  100000   5000.0  2012.0    4.0      FORD
1  100001  10000.0  2015.0    5.0  MERCEDES
3  100002  15000.0  2016.0    5.0      AUDI
person MaxU    schedule 12.04.2017
comment
Идея - возможно, проблема в том, что имена столбцов смешаны с данными, вы можете добавить тестовый код там, где есть неверные данные. - person jezrael; 12.04.2017
comment
Привет всем, спасибо за ваш ответ и помощь. Ошибки='принуждение' позволяют уйти. Но после разных попыток в iPython мой столбец PRICE не содержит слово «PRICE», поэтому я не знаю, почему эта ошибка. Так что метод работает хорошо, большое спасибо за это !! - person Chris PERE; 12.04.2017
comment
@jezrael, я добавил твою идею к ответу;) - person MaxU; 12.04.2017