2016-10-20 5 views
1

поэтому у меня есть очень большой dataframe в основном плавает (читать из CSV), но каждый сейчас и потом, я получаю строку, или нанпитон, панды, работать через плохие данные

      date load 
0 2016-07-12 19:04:31.604999 0 
... 
10 2016-07-12 19:04:31.634999 nan 
... 
50 2016-07-12 19:04:31.664999 ".942.197" 
... 

I может иметь дело с NaNs (интерполировать), но не может понять, как использовать заменить для того, чтобы поймать строки, а не число

df.replace(to_replace='^[a-zA-Z0-9_.-]*$',regex=True,value = float('nan')) 

возвращает весь Nans. Я не буду использовать только тогда, когда это на самом деле строка

+0

Можете ли вы опубликовать пример «что-то странное» –

+0

, строка - это единственная проблема, которую я имею, удалил «что-то странное» из моего вопроса. –

ответ

2

Я думаю, вы хотите pandas.to_numeric. Он работает с последовательными данными.

In [1]: import pandas as pd 

In [2]: df = pd.DataFrame([0, float('nan'), '.942.197'], columns=['load']) 

In [3]: df 
Out[3]: 
     load 
0   0 
1  NaN 
2 .942.197 

In [4]: pd.to_numeric(df['load'], errors='coerce') 
Out[4]: 
0 0.0 
1 NaN 
2 NaN 
Name: load, dtype: float64 

На самом деле to_numeric будет пытаться преобразовать каждый элемент в числовой, так что если у вас есть строка, которая выглядит как номер будет преобразован:

In [5]: df = pd.DataFrame([0, float('nan'), '123.456'], columns=['load']) 

In [6]: df 
Out[6]: 
     load 
0  0 
1  NaN 
2 123.456 

In [7]: pd.to_numeric(df['load'], errors='coerce') 
Out[7]: 
0  0.000 
1  NaN 
2 123.456 
Name: load, dtype: float64 

Я не знаю, какой-либо способ, чтобы преобразовать каждый нецифровой тип до nan, кроме итерации (или, может быть, apply или map) и проверьте на isinstance.

+0

это привело к значению 992344 (просто что-то огромное, когда я знаю, что мои данные находятся только между нулем и одним), поэтому мне пришлось следить за df = df [df <1]; благодаря! –

+0

@ user2539738 Да, я пропустил эту часть, потому что у вашего образца не было числовых строк. См. Править. Я не знаю, как преобразовать каждую строку в 'nan' элегантным и эффективным способом, если это то, что вы хотите. – Goyo

0

Это мое понимание, что .replace() применимо только к string datatypes. Если вы примените его к нестрочному типу данных (например, к вашим числовым типам), он вернет nan. Преобразование всего кадра/серии в строку перед использованием replace будет работать вокруг этого, но, вероятно, это не лучший способ сделать это (например, см. Ответ @ Goyo)!

См. Примечания на странице this.