Python Pandas Dataframe填充NaN值

2024-10-01 05:01:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用来自标准正态分布的值填充数据帧中的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)]

在旋转数据帧“data”之后,它看起来像这样:

^{pr2}$

但是,我需要用一个新的随机值替换每个NaN值。所以我创建了一个只包含随机值(dfrand)的新df,然后尝试用与Nan的索引相对应的dfrand值来交换缺失的数字(Nan)- 虽然表达

 np.isnan(data)

返回由真值和假值组成的数据帧表达式

  dfrand[np.isnan(data)]

只返回NaN值,这样整个技巧就不起作用了。 有什么问题吗?在


Tags: 数据代码dfdata标准npnanselect
2条回答

三千列并不多。你有几排?您总是可以随机生成一个相同大小的数据帧并进行逻辑替换(数据帧的大小将决定这是否可行)。在

如果您知道数据帧的大小:

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

如果你不知道你的数据帧的大小,那就把事情弄得乱七八糟

^{pr2}$

编辑 根据“用户”最后的评论: “德兰德[np.伊斯南(data)]只返回NaN。”

对!这正是你想要的。在我的解决方案中,我有:数据[np.伊斯南(数据)]=dfrand[np.伊斯南(数据)]。翻译过来,这意味着:从dfrand中随机生成的值对应于“data”中的NaN位置,并将其插入“data”,其中“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

如您所见,中的所有NaN都已替换为中基于的NaN值索引随机生成的值。在

你可以尝试这样的方法,假设你正在处理一个系列:

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)

相关问题 更多 >