2014-12-16 85 views
5

Tôi đang cố gắng điền các giá trị NaN vào một khung dữ liệu với các giá trị đến từ một phân bố chuẩn chuẩn. này hiện mã của tôi:Python Pandas Dataframe điền các giá trị 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)] 

Sau khi xoay vòng các dataframe 'dữ liệu' có vẻ như rằng:

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 

Tuy nhiên, tôi cần điều đó mỗi giá trị NaN sẽ được thay thế bằng một giá trị ngẫu nhiên mới. Vì vậy, tôi tạo ra một df mới bao gồm chỉ các giá trị ngẫu nhiên (dfrand) và sau đó cố gắng để trao đổi các số bị mất (Nan) bởi các giá trị từ dfrand tương ứng với các chỉ số của NaN. Vâng - tiếc là nó không hoạt động - Mặc dù khái niệm

np.isnan(data) 

trả về một dataframe bao gồm giá trị True và False, khái niệm

dfrand[np.isnan(data)] 

trở lại chỉ có giá trị NaN để lừa tổng thể không công việc. Bất kỳ ý tưởng nào về vấn đề này?

Trả lời

0

bạn có thể thử một cái gì đó như thế này, giả sử bạn đang đối phó với một loạt:

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

nếu tôi cần quét TẤT CẢ các cột thì sao? những gì tôi vượt qua như là tham số cho báo cáo đầu tiên và thứ ba? – user4045430

+0

chỉ cần lặp lại. 'for c trong data.columns: ...' – acushner

+1

Tôi có hơn 3000 cột. Có thể có một cách nhanh hơn? – user4045430

4

Ba ngàn cột không phải là quá nhiều. Bạn có bao nhiêu hàng? Bạn luôn có thể làm cho một dataframe ngẫu nhiên có cùng kích thước và làm một sự thay thế hợp lý (kích thước của dataframe của bạn sẽ chỉ ra cho dù đây là khả thi hay không

nếu bạn biết kích thước của dataframe của bạn:.

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)] 

nếu bạn không biết kích thước của dataframe bạn, chỉ cần xáo trộn những thứ xung quanh

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)] 

EDIT mỗi "người dùng" bình luận cuối cùng: "dfrand [np.isnan (dữ liệu)] chỉ trả về NaN."

Phải! Và đó là chính xác những gì bạn muốn. Trong giải pháp của tôi, tôi có: dữ liệu [np.isnan (dữ liệu)] = dfrand [np.isnan (dữ liệu)]. Được dịch, điều này có nghĩa là: lấy giá trị được tạo ngẫu nhiên từ dfrand tương ứng với vị trí NaN trong "dữ liệu" và chèn nó vào "dữ liệu" trong đó "dữ liệu" là NaN. Một ví dụ sẽ giúp:

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 

Như bạn có thể thấy, trong tất cả các của NaN đã được thay thế bằng giá trị ngẫu nhiên được tạo ra trong chỉ số nan-giá trị dựa trên 's.

+0

Biểu thức np.isnan (dữ liệu) trả về FALSE trên toàn bộ khung dữ liệu. Trong khi tôi tích cực là có nhiều giá trị 'NaN'. Bất kỳ ý tưởng tại sao? – user4045430

+0

Bạn có chắc chắn bạn có các giá trị nan "thực" (tức là nổi) hay chỉ là chuỗi? – tnknepp

+0

Có lẽ tôi là người ngu ngốc. Tùy thuộc vào cách bạn đọc trong dataframe của bạn, bạn có thể có chuỗi hoặc float/ints. Nếu bạn biết bạn có một NaN trong cột đầu tiên, bạn chỉ có thể làm data.dtypes [data.columns [0]]. Nếu bạn nhận được: dtype ('float64') thì bạn biết bạn có một NaN "thực" chứ không phải chỉ là chuỗi.Điều đó đang được nói, có thể bạn đã tải nó đúng cách và tôi đang ngu ngốc. Có: "True in np.isnan (data)" trả về True hay False? – tnknepp

Các vấn đề liên quan