2016-11-24 9 views
4

Применение pandas.to_numeric к колонке dataframe, который содержит строки, представляющие результаты числа (и, возможно, другие неразборчивым строки) в сообщении об ошибке, как это: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 

Не было бы полезно увидеть, какое значение не удалось проанализировать?

+0

Возможно, но кодируется как строки (например, "NA"). Дело в том, чтобы указать на такие значения. – clstaudt

ответ

11

Я думаю, вы можете добавить параметр 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 значений if is 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 
1

Я думал об одном и том же, и я не знаю, есть ли лучший способ, но моим текущим обходным путем является поиск символов, которые не являются числами или периодами. Это обычно вызывает проблему. Бывают случаи, когда несколько периодов могут вызвать проблему, но я обнаружил, что они редки.

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)] 

 Смежные вопросы

  • Нет связанных вопросов^_^