2017-04-12 53 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」這個詞,所以我不知道爲什麼會出現這個錯誤。 所以這個方法很好,非常感謝你! –