2014-12-16 8 views
5

표준 정규 분포에서 오는 값으로 데이터 프레임의 NaN 값을 채우려고합니다.Python Pandas Dataframe NaN 값 채우기

sqlStatement = "select * from sn.clustering_normalized_dataset" 
df = psql.frame_query(sqlStatement, cnx) 
data=df.pivot("user","phrase","tfw") 
dfrand = pd.DataFrame(data=np.random.randn(data.shape[0],data.shape[1])) 
data[np.isnan(data)] = dfrand[np.isnan(data)] 

가 그렇게 보이는 dataframe '데이터'를 선회 후 :

phrase  aaron abbas abdul  abe able abroad  abu  abuse \ 
user                   
14233664  NaN NaN NaN  NaN NaN  NaN  NaN  NaN 
52602716  NaN NaN NaN  NaN NaN  NaN  NaN  NaN 
123456789  NaN NaN NaN  NaN NaN  NaN  NaN  NaN 
500158258  NaN NaN NaN  NaN NaN  NaN  NaN  NaN 
517187571  0.4 NaN NaN 0.142857  1  0.4 0.181818  NaN 

는 그러나, 나는 각각의 NaN 값은 새로운 임의의 값으로 대체됩니다 필요 이 현재 나의 코드입니다. 그래서 새로운 df를 임의의 값 (dfrand)만으로 구성한 다음 누락 된 숫자 (Nan)를 NaN의 인덱스에 해당하는 dfrand의 값으로 교체하려고했습니다. 글쎄 - 불행히도 작동하지 않습니다 - 을

np.isnan(data) 

가 dataframe을 반환

이 True와 False 값으로 구성 표현, 표현하지만

dfrand[np.isnan(data)] 

반환에만 NaN의 값을 전체 트릭을하지 않도록 작업. 어떤 아이디어가 문제입니까?

답변

0

당신은 당신이 하나의 시리즈를 다루고있는 가정, 이런 식으로 뭔가를 시도 할 수 :

ser = data['column_with_nulls_to_replace'] 
index = ser[ser.isnull()].index 
df = pd.DataFrame(np.random.randn(len(index)), index=index, columns=['column_with_nulls_to_replace']) 
ser.update(df) 
+0

모든 열을 스캔해야하는 경우 어떻게해야합니까? 첫 번째와 세 번째 문장에 매개 변수로 무엇을 전달합니까? – user4045430

+0

그냥 반복합니다. 'for data.columns : ... ' – acushner

+1

나는 3000 개 이상의 칼럼을 가지고있다. 어쩌면 더 빠른 방법이 있을까요? – user4045430

4

세 만 열이 많은되지 않습니다. 얼마나 많은 행이 있습니까? 당신은 항상 같은 크기의 임의의 dataframe을하고이 가능인지 여부가 달라집니다 논리적 교체 (당신의 dataframe의 크기를 할 수

당신이 당신의 dataframe의 크기를 알고있는 경우 :.

import pandas as pd 
import numpy as np 

# create random dummy dataframe 
dfrand = pd.DataFrame(data=np.random.randn(rows,cols)) 

# import "real" dataframe 
data = pd.read_csv(etc.) # or however you choose to read it in 

# replace nans 
data[np.isnan(data)] = dfrand[np.isnan(data)] 

그냥

import pandas as pd 
import numpy as np 



# import "real" dataframe 
data = pd.read_csv(etc.) # or however you choose to read it in 

# create random dummy dataframe 
dfrand = pd.DataFrame(data=np.random.randn(data.shape[0],data.shape[1])) 

# replace nans 
data[np.isnan(data)] = dfrand[np.isnan(data)] 

편집 당 "사용자"최근 코멘트 주위에 물건을 셔플, 당신의 dataframe의 크기를 알 수없는 경우 : 는 "dfrand는 [np.isnan는 (데이터)]는 NaN이 반환합니다."

오른쪽! 그게 바로 당신이 원하는 것입니다. 내 솔루션에서 나는 가지고있다 : data [np.isnan (data)] = dfrand [np.isnan (data)]. Translated : 즉, "data"내의 NaN 위치에 해당하는 dfrand에서 무작위로 생성 된 값을 가져 와서 "data"가 "data"가 NaN 인 "data"에 삽입합니다. 예 도움이 될 것입니다 : 당신이 볼 수 있듯이, 모든 NaN의의의가의 기반 할머니 가치 지수에서 임의로 생성 된 값으로 대체 된

a = pd.DataFrame(data=np.random.randint(0,100,(10,3))) 
a[0][5] = np.nan 

In [32]: a 
Out[33]: 
    0 1 2 
0 2 26 28 
1 14 79 82 
2 89 32 59 
3 65 47 31 
4 29 59 15 
5 NaN 58 90 
6 15 66 60 
7 10 19 96 
8 90 26 92 
9 0 19 23 

# define randomly-generated dataframe, much like what you are doing, and replace NaN's 
b = pd.DataFrame(data=np.random.randint(0,100,(10,3))) 

In [39]: b 
Out[39]: 
    0 1 2 
0 92 21 55 
1 65 53 89 
2 54 98 97 
3 48 87 79 
4 98 38 62 
5 46 16 30 
6 95 39 70 
7 90 59 9 
8 14 85 37 
9 48 29 46 


a[np.isnan(a)] = b[np.isnan(a)] 

In [38]: a 
Out[38]: 
    0 1 2 
0 2 26 28 
1 14 79 82 
2 89 32 59 
3 65 47 31 
4 29 59 15 
5 46 58 90 
6 15 66 60 
7 10 19 96 
8 90 26 92 
9 0 19 23 

.

+0

표현식 np.isnan (data)은 데이터 프레임 전체에서 FALSE를 반환합니다. 나는 'NaN'값이 많다는 것이 긍정적이지만. 왜 그런가? – user4045430

+0

"실제"값 (즉, 수레) 또는 문자열 만 사용 하시겠습니까? – tnknepp

+0

아마도 나는 어리 석다. 데이터 프레임에서 읽는 방법에 따라 문자열이나 부동 소수점/정수를 가질 수 있습니다. 첫 번째 열에 NaN이 있음을 알고 있다면 data.dtypes [data.columns [0]] 만 수행하면됩니다. 얻을 수있는 경우 : dtype ('float64') 그러면 문자열과는 달리 "실제"NaN이 있음을 알 수 있습니다.그 말은, 당신은 아마 제대로로드하고 바보가되고있다. 않습니다 : "true로 np.isnan (데이터)"반환 사실 또는 거짓? – tnknepp

관련 문제