2017-04-12 16 views
1

私はパンダに大きな問題があります。私は列に:私は.apply(INT)または(INT(x)はラムダX)私は.astypeを使用するときに、私は私の価格、YEARおよびMONTH列に変換したいが変換中のエラーpandasデータフレームpython 3

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

を含む、重要なデータフレームを持っています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」という単語が含まれているので、なぜこのエラーが発生するのかわかりません。 この方法はうまくいきます。 –

関連する問題