2017-05-19 3 views
0

나는 pandas와 Python3.4를 사용하여 데이터를 조작하고 있습니다. 특정 CSV 파일에 문제가 있습니다. 왜 nan 값이 있더라도 판다는 일반적으로 열을 float으로 읽습니다. 여기서 그것들을 string으로 읽습니다. 문제는 내가 때문에 마지막에 nan 값의 float로 변환 할 수 있습니다pandas DataFrame의 열을 nan 값으로 float으로 변환

Date  RR TN TX 
08/10/2015 0 10.5 19.5 
09/10/2015 0 5.5 20 
10/10/2015 0 5 24 
11/10/2015 0.5 7 24.5 
12/10/2015 3 12 23 
... 
27/04/2017       
28/04/2017       
29/04/2017       
30/04/2017       
01/05/2017       
02/05/2017       
03/05/2017       
04/05/2017       

: 여기처럼 내 csv 파일이 모습입니다. 내가하려고하기 때문에 나는 float으로 그들을 필요로한다 TN + TX. 이것은 내가 지금까지 뭘하려 :

파일 읽기 : 나는 또한 시도 추가를 수행 할 순간에, 그렇지 않으면

dtype = { 
    'TN': np.float, 
    'TX': np.float 
} 
dfs[code] = pd.read_csv(path, sep = ';', index_col = 0, parse_dates = True, encoding = 'ISO-8859-1', dtype = dtype) 

: 나는 또한 시도

dfs[code] = pd.read_csv(path, sep = ';', index_col = 0, parse_dates = True, encoding = 'ISO-8859-1', dtype = float) 

하지만 항상 같은 오류가 발생합니다.

ValueError: could not convert string to float. 

값이 nan 인 경우 행 단위로 테스트 할 수 있음을 알고 있습니다.하지만 더 쉬운 방법이 있다고 확신합니다. 어떻게하는지 아십니까? 또는 행별로 행해야합니까? 감사.

+1

을 원하는대로 이것은 반환 '을,' '파일이 공백으로 구분되는 경우? – Taylor

+0

@Taylor ';'로 구분되며 예제를 더 쉽게 읽을 수 있도록 공백으로 썼습니다. – Silveris

답변

1

팬더가 dtype 자체를 감지하도록 허용하면 ValueError를 피하고 근본적인 문제를 찾아 낼 수 있습니다.

In [4]: df = pd.read_csv(path, sep=';', index_col=0, parse_dates=True, low_memory=False) 
In [5]: df 
Out[5]: 
Empty DataFrame 
Columns: [] 
Index: [08/10/2015 0 10.5 19.5, 09/10/2015 0 5.5 20, 10/10/2015 0 5 24, 11/10/2015 0.5 7 24.5, 12/10/2015 3 12 23, 27/04/2017      , 28/04/2017      , 29/04/2017      , 30/04/2017      , 01/05/2017      , 02/05/2017      , 03/05/2017      , 04/05/2017  ] 

당신의 파일을 공백으로 구분되는대로, 실수로 ';'로 구분 기호를 지정 보인다. 세미콜론이 없으므로 전체 행이 색인으로 읽혀집니다.

첫째,

df = pd.read_csv(path, delim_whitespace=True, index_col=0, parse_dates=True, low_memory=False) 

지금, 행의 일부가 불완전한 데이터를 적절한 구분 기호를 사용하여 파일에 읽어보세요. 단순한 솔루션은 개념적으로 값을 np.float으로 변환하고 다른 경우에는 np.nan으로 바꾸는 것입니다.

def f(x): 
    try: 
     return np.float(x) 
    except: 
     return np.nan 

df["TN"] = df["TN"].apply(f) 
df["TX"] = df["TX"].apply(f) 

print(df.dtypes) 

왜`9월 = 사용

RR  object 
TN float64 
TX float64 
dtype: object 
+0

감사합니다. 이것은 완벽하게 작동했습니다. 나는'apply()'메소드를 완전히 잊었다. – Silveris

관련 문제