2016-10-20 4 views
1

그래서 대부분의 매우 큰 dataframe의 (a 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 문자열을 얻거나 유모 수레있어 NaN이 (보간)를 처리 할 수 ​​있지만, 문자열을 잡기 위해 대체 사용하는 방법을 알아낼 수 없습니다, 그리고 숫자

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

반환 모든 NaN을. 나는 그것이 실제로 문자열 일 때만을 기다린다.

+0

'something weird'의 예를 게시 할 수 있습니까 –

+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 

내가 모든 변환 할 수있는 방법을 인식하지 오전 0이 아닌 숫자를 nan으로 바꾸고 반복하지 말고 apply 또는 map을 사용하고 isinstance을 확인하십시오.

+0

이것은 992344의 값을 얻었습니다. (데이터가 0과 1 사이에있을 때 거대한 것입니다.) 그래서 df = df [df <1]; 감사! –

+0

@ user2539738 예, 샘플에 숫자 문자열이 없어서 그 부분을 건너 뜁니다. 편집을 참조하십시오. 우아하고 효율적인 방법으로 모든 문자열을'nan'으로 변환하는 방법을 모르겠습니다. – Goyo

0

.replace()문자열 데이터 유형에만 적용됩니다. 문자열이 아닌 데이터 유형 (예 : 숫자 유형)에 적용하면 나노를 반환합니다. 바꾸기를 사용하기 전에 전체 프레임/시리즈를 문자열로 변환하면이 문제를 해결할 수 있지만 "최고"방법은 아닙니다 (예 : @ Goyo의 답변 참조)!

this 페이지의 참고 사항을 참조하십시오.