web-dev-qa-db-ja.com

pandas.to_numeric-解析できなかった文字列を調べる

申請中 pandas.to_numeric数値を表す文字列(および場合によっては他の解析不能な文字列)を含むデータフレーム列に対して、次のようなエラーメッセージが表示されます。

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-66-07383316d7b6> in <module>()
      1 for column in shouldBeNumericColumns:
----> 2     trainData[column] = pandas.to_numeric(trainData[column])

/usr/local/lib/python3.5/site-packages/pandas/tools/util.py in to_numeric(arg, errors)
    113         try:
    114             values = lib.maybe_convert_numeric(values, set(),
--> 115                                                coerce_numeric=coerce_numeric)
    116         except:
    117             if errors == 'raise':

pandas/src/inference.pyx in pandas.lib.maybe_convert_numeric (pandas/lib.c:53558)()

pandas/src/inference.pyx in pandas.lib.maybe_convert_numeric (pandas/lib.c:53344)()

ValueError: Unable to parse string

どの値が解析に失敗したかを確認することは役に立ちませんか?

10
clstaudt

パラメータerrors='coerce'を追加して、不良な非数値をNaNに変換し、この値を isnull でチェックして、 boolean indexing

print (df[pd.to_numeric(df.col, errors='coerce').isnull()])

サンプル:

df = pd.DataFrame({'B':['a','7','8'],
                   'C':[7,8,9]})

print (df)
   B  C
0  a  7
1  7  8
2  8  9

print (df[pd.to_numeric(df.B, errors='coerce').isnull()])
   B  C
0  a  7

または、混合列ですべての文字列を見つける必要がある場合-文字列値を持つ数値は、typeの場合、値のstringをチェックします。

df = pd.DataFrame({'B':['a',7, 8],
                   'C':[7,8,9]})

print (df)
   B  C
0  a  7
1  7  8
2  8  9

print (df[df.B.apply(lambda x: isinstance(x, str))])
   B  C
0  a  7
17
jezrael

私はまったく同じことを考えており、より良い方法があるかどうかはわかりませんが、現在の回避策は、数字でもピリオドでもない文字を検索することです。これは通常、問題を解決します。複数の期間が問題を引き起こす場合がありますが、私はそれらがまれであることを発見しました。

import pandas as pd
import re

non_numeric = re.compile(r'[^\d.]+')

df = pd.DataFrame({'a': [3,2,'NA']})
df.loc[df['a'].str.contains(non_numeric)]
2
3novak