2016-04-18 2 views
4

У меня есть DataFrame, в котором столбец может иметь три типа значений, целые числа (12331), целые числа в виде строк ('345') или некоторые другие строки («текст»).Игнорирование нечисловых строковых значений в pandas dataframe

Есть ли способ удалить все строки с последним видом строки из dataframe и преобразовать первый тип строки в целые числа? Или, по крайней мере, каким-то образом игнорировать строки, которые вызывают ошибки типа, если я суммирую столбец.

Этот блок данных предназначен для чтения довольно большого CSV-файла (25 ГБ), поэтому я хотел бы, чтобы какое-то решение работало при чтении в кусках.

ответ

6

У Pandas есть инструменты для преобразования этих столбцов, но они могут не соответствовать вашим потребностям. pd.to_numeric преобразует смешанные столбцы, подобные вашим, но преобразует нечисловые строки в NaN. Это означает, что вы получите столбцы float, а не целочисленные, поскольку только столбцы с плавающей точкой могут иметь значения NaN. Обычно это не имеет большого значения, но хорошо знать.

df = pd.DataFrame({'mixed_types': [12331, '345', 'text']}) 

pd.to_numeric(df['mixed_types'], errors='coerce') 
Out[7]: 
0 12331.0 
1  345.0 
2  NaN 
Name: mixed_types, dtype: float64 

Если вы хотите, чтобы затем удалить все строки NaN:

# Replace the column with the converted values 
df['mixed_types'] = pd.to_numeric(df['mixed_types'], errors='coerce') 

# Drop NA values, listing the converted columns explicitly 
# so NA values in other columns aren't dropped 
df.dropna(subset = ['mixed_types']) 
Out[11]: 
    mixed_types 
0  12331.0 
1  345.0 
+0

Поскольку NaN создается после чтения, будут ли эти значения удалены, если я установил na_values ​​= 'NaN' и выполнил drop_na? – devil0150

+0

@ devil0150 Да, делаю 'dropna()', как только вы конвертируете, не так сложно, см. Мое редактирование. – Marius

+0

Не работает для валюты «$ 1.00». :( – xtian

1

Вы можете использовать pd.to_numeric с errors=coerce заменить ваши не числовых значений с NaN и применять его в каждом столбце. Тогда вы можете использовать dropna или fillna все, что пожелаете.

df = pd.read_csv('file.csv') 
df = df.apply(pd.to_numeric, errors='coerce') 
df = df.dropna() 
0

Вы можете использовать df._get_numeric_data() напрямую.