如何在numpy数组中计算每个分类列

时间:2016-09-13 04:57:57

标签: python pandas numpy

有很好的解决方案来估算熊猫数据帧。但由于我主要使用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数组中直接输入?

1 个答案:

答案 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,对于此类关系案例,它将是最低的。

如果您正在处理stringsNaNs这样的混合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进行模式计算,我们应该没问题。