2014-12-16 38 views
5

Standart bir normal dağılımdan gelen değerlerle bir veri çerçevesindeki NaN değerlerini doldurmaya çalışıyorum.Python Pandas Dataframe doldurma NaN değerleri

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

öyle gibi gözüküyor dataframe 'veri' dönme sonra::

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 

Ancak, ben her NaN değeri yeni bir rastgele değerle değiştirilecektir Buna ihtiyacım Bu, şu anda benim kodudur. Bu yüzden yeni bir df yarattım, sadece rastgele değerler (dfrand) ve sonra da eksik sayıları (Nan), NaN'lerin indislerine karşılık gelen dfrand değerleri ile değiştirmeye çalıştım. Eh - ne yazık ki çalışmıyor -

np.isnan(data) 

bir dataframe döndürür

True ve False değerlerinden oluşur ifadesi, ifade rağmen

dfrand[np.isnan(data)] 

dönüş sadece NaN değerleri genel hile yapmaz böylece iş. Sorun hakkında herhangi bir fikrin var mı?

cevap

0

Eğer bir serisi ile ilgileniyor varsayarak böyle bir şey deneyebilirsiniz:

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

TÜM sütunları taramam gerekirse ne olur? İlk ve üçüncü ifadeye ne parametre olarak geçebilirim? – user4045430

+0

sadece yineleyin. data.columns içinde c için: ... ' – acushner

+1

Ben 3000'den fazla sütun var. Belki daha hızlı bir yol var mı? – user4045430

4

Üç bin sütunlar kadar çok değildir. Kaç tane satır var? Hep aynı büyüklükteki bir rasgele dataframe yapmak ve bu uygulanabilir olup olmadığını dikte edecek bir mantıksal değiştirme (sizin dataframe boyutunu yapabileceği

Eğer dataframe boyutunu biliyorsanız.

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

sadece

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'e Başına "kullanıcılar" son yorum çevresindeki şeylerin yerini, sizin dataframe boyutunu bilmiyorsanız: "dfrand [np.isnan (veri)] sadece NaN döndürür."

Doğru! Ve tam istediğin buydu. Benim çözümümde: veri [np.isnan (data)] = dfrand [np.isnan (data)]. Çeviri şu anlama gelir: "veri" içindeki NaN konumuna karşılık gelen ve "veri" nin NaN olduğu "veri" ye ekleyen, rastgele oluşturulmuş değeri dfrand'dan alın. Bir örnek yardımcı olacaktır: Gördüğünüz gibi, tüm NaN en bölgesindeki 'ın dayanan nan-değer endekslerinde rastgele oluşturulmuş değerle almıştır

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 (veri) ifadesi, tüm veri çerçevesi üzerinde FALSE değerini döndürür. Ben olumlu olmakla birlikte birçok 'NaN' değeri var. Bir fikrin neden? – user4045430

+0

"Gerçek" nan değerlerinizin (yani yüzer) veya sadece dizeleriniz olduğundan emin misiniz? – tnknepp

+0

Belki de aptal olan benim. Veri çerçevenizde nasıl okunduğunuza bağlı olarak dizeleriniz veya şamandıralarınız olabilir. İlk sütunda bir NaN'nuz olduğunu biliyorsanız, sadece data.dtypes [data.columns [0]] yapabilirsiniz. Eğer alırsanız: dtype ('float64') o zaman sadece dizelere karşı bir "gerçek" NaN var biliyorum.Öyle söyleniyorsa, muhtemelen doğru şekilde yüklendiniz ve aptalım. Does: "np.isnan (veri) 'de doğru" True veya False döndürür? – tnknepp

İlgili konular