2017-04-12 49 views
1

熊猫有一个很大的问题。我有一个包含转换过程中出现错误列熊猫数据框架python 3

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

我想转换我的价格,年份和月份列,但是当我使用.astype(INT)或。适用一个重要的数据帧:在列I(拉姆达X INT(X))收到一个ValueError。我的数据框的长度是180万行。

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

所以我不明白为什么熊猫想要转换列的名称。

你能解释一下为什么吗?

最佳,

C.

+0

请发布原始数据和完整的代码,是错误 – EdChum

+0

对不起,我的数据和代码是保密的,所以我不能分享他们。我可以告诉你一个数据集(测试)和错误。 –

回答

2

试试这个:

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 

然后.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 
+1

想法 - 也许问题是列名与数据混合在一起,你可以在测试代码中添加坏数据。 – jezrael

+0

@jezrael,好点,谢谢!我要补充说... – MaxU

+0

大家好, 感谢您的回复和帮助。错误='胁迫'许可证可以消失。但是,在iPython的不同尝试之后,我的专栏PRICE donc包含“PRICE”这个词,所以我不知道为什么会出现这个错误。 所以这个方法很好,非常感谢你! –