有很好的解决方案来估算熊猫数据帧。但由于我主要使用numpy数组,我必须创建新的panda DataFrame对象,然后将其转换回numpy数组,如下所示:
nomDF=pd.DataFrame(x_nominal) #Convert np.array to pd.DataFrame
nomDF=nomDF.apply(lambda x:x.fillna(x.value_counts().index[0])) #replace NaN with most frequent in each column
x_nominal=nomDF.values #convert back pd.DataFrame to np.array
有没有办法在numpy数组中直接输入?
答案 0 :(得分:1)
我们可以使用Scipy's mode
获取每列中的最高值。剩下的工作是获取NaN
索引,并通过索引将mode
值替换为输入数组中的索引。
所以,实现看起来像这样 -
from scipy.stats import mode
R,C = np.where(np.isnan(x_nominal))
vals = mode(x_nominal,axis=0)[0].ravel()
x_nominal[R,C] = vals[C]
请注意,对于pandas
,对于value_counts
,如果许多类别/元素具有相同的最高计数,我们将选择最高值。即在领带情况下。对于Scipy's mode
,对于此类关系案例,它将是最低的。
如果您正在处理strings
和NaNs
这样的混合dtype,我建议您进行一些修改,保持最后一步不变,以使其有效 -
x_nominal_U3 = x_nominal.astype('U3')
R,C = np.where(x_nominal_U3=='nan')
vals = mode(x_nominal_U3,axis=0)[0].ravel()
这会对模式计算发出警告:RuntimeWarning: The input array could not be properly checked for nan values. nan values will be ignored.
"values. nan values will be ignored.", RuntimeWarning)
。但是,因为我们实际上想忽略NaNs
进行模式计算,我们应该没问题。