2016-02-03 2 views
1

Я новичок в модуле python python и пытаюсь использовать его для простой цели проверки положительных интегральных значений поля «Высота» в файле csv.Интегральное значение в проверке файла csv с использованием модуля pandas

test.csv

Name,Height 
Name1,1234 
Name2,1234.2 
Name3,-1234 
Name4, 

Есть ли способ, чтобы определить все недопустимые значения (отрицательная, поплавок, строка, пустых) с помощью функции панд. Я попробовал несколько вариантов, которые являются специфическими для одного недопустимых значений, но создают исключение для других типов недопустимых значений:

  • Задвижки пустых значений или не числовых значений, но не плавающие, так и отрицательных значения: df['Height'].convert_objects(False,True,False,False).isnull()
  • Задвижки с плавающей значения, но вызывает исключение пустых и нечисловых значений df['Height'] != df['Height'].astype(numpy.int64)
  • Принуждение типа во время read_csv кидает исключение для не числовых значений pandas.read_csv('test.csv', dtype={'Height':int}

Любое предложение для лучшего захвата всех недопустимых комбинаций или любого другого модуля для проверки содержимого файла csv. Я пробовал csv, petl тоже, где спецификация типа поля заголовка кажется более контролируемой, но не такой функциональной, как панды.

ответ

0

Я не уверен, что вы хотите сделать с результатами, но вот пара вариантов, если вы уже загрузили в dataframe с помощью df = pd.read_csv(myfile).

df['valid'] = np.where((df.Height >= 0) & (df.Height.replace('', 0.5).mod(1) == 0), True, False) 

Это добавляет valid колонку, как так:

Name Height valid 
0 Name1 1234 True 
1 Name2 1234.2 False 
2 Name3 -1234 False 
3 Name4   False 

В качестве альтернативы можно просто отфильтровать недопустимые строки:

df = df[(df.Height >= 0) & (df.Height.replace('', 0.5).mod(1) == 0)] 

Который оставляет вас с:

Name Height 
0 Name1 1234 

В любом случае Я использовал тот же df.Height >= 0, чтобы отметить строки и негативы, и df.Height.replace('', 0.5).mod(1) == 0, чтобы отметить поплавки для удаления. Я сделал replace('', 0.5), чтобы обойти mod, не любимые строки - может быть более изящный способ.

0

Вы почти там:

Задвижка пустых значения или не числовые значения, но не плавающее и отрицательных значения:
df['Height'].convert_objects(False,True,False,False).isnull()

Но путем преобразования серии в числовом вы не больше иметь дело с нечисловыми значениями, что хорошо.

Btw convert_objects теперь не рекомендуется, и вместо этого рекомендуется использовать to_numeric.

Задвижки плавающие значения, но вызывает исключение пустых и нечисловых значений
df['Height'] != df['Height'].astype(numpy.int64)

Non-числовые значения, не будет проблемой, если вы делаете это с числовым только для серии выше (они стали наном). Чтобы избежать исключения на использование Нэн Series.round() вместо Series.astype(numpy.int64)

Форсаж типа во время read_csv кидает исключение для не числовых значений
pandas.read_csv('test.csv', dtype={'Height':int}

На этом этапе вам не нужно это.

Так давайте это все toguether:

from StringIO import StringIO # use io.StringIO with python3 
import pandas as pd 


def is_invalid(s): 
    x = pd.to_numeric(s, errors='coerce') 
    return (x.isnull()) | (x < 0) | (x != x.round()) 


text = '''Name,Height 
Name1,1234 
Name2,1234.2 
Name3,-1234 
Name4, 
Name5,some string''' 

df = pd.read_csv(StringIO(text)) 
print(df.assign(invalid=is_invalid(df['Height']))) 

    Name  Height invalid 
0 Name1   1234 False 
1 Name2  1234.2 True 
2 Name3  -1234 True 
3 Name4   NaN True 
4 Name5 some string True 
Смежные вопросы