【问题标题】:Error during conversion column pandas data frame python 3转换列熊猫数据框python 3期间出错
【发布时间】:2017-09-08 02:57:08
【问题描述】:

我对熊猫有一个大问题。我有一个包含

的重要数据框
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。我的数据框的长度为 180 万行。

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

所以我不明白为什么pandas要转换列名。

你能解释一下为什么吗?

最好的,

C.

【问题讨论】:

  • 请发布重现此错误的原始数据和完整代码
  • 对不起,我不能,我的数据和代码是机密的,所以我不能分享它们。我可以给你看一个数据集(测试)和错误。

标签: python-3.x pandas valueerror


【解决方案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 has added in this comment,您的数据集中很可能有“坏”(意外)值。

您可以使用以下技术之一来清理它:

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

如果您知道原始数据集中没有NaN,然后是.dropna(how='any')

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

【讨论】:

  • 想法 - 可能问题是列名与数据混合,您可以在错误数据的地方添加测试代码。
  • 大家好,感谢您的回复和帮助。 errors='coerce' 允许消失。但是,在 iPython 中进行了不同的尝试后,我的 PRICE donc 列包含单词“PRICE”,所以我不知道为什么会出现这个错误。所以这个方法很好用,非常感谢!!
  • @jezrael,我已将您的想法添加到答案中;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2019-10-12
  • 2021-05-27
  • 2018-07-13
  • 2019-05-22
相关资源
最近更新 更多