大熊猫

时间:2017-11-16 08:44:06

标签: python pandas dataframe masking

我有一个方形矩阵作为数据帧,我想将对角线上方的所有值投影到一个系列中。我的想法是屏蔽对角线下方的所有元素,然后将数据帧转储到一个序列中,但它也会转储NaN值。这是一个例子:

users=[1,2,3,4,5]
cols=range(1,6)

matrix=pd.DataFrame(np.random.randn(len(users),len(cols)), index=users,columns=cols)
mask = np.ones(matrix.shape,dtype='bool')
mask[np.triu_indices(len(matrix))] = False
series=matrix.mask(mask).values.ravel()

在系列中,我获得了所有上部tiangle值以及与下部三角形对应的所有NaN值。显然,我理解错误:我已经明白,通过屏蔽数据帧中的某些元素,不会使用屏蔽元素。谁知道我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

选项1
使用pd.DataFrame.stack,因为它会为您转储np.nan

matrix.mask(mask).stack().values

array([ 0.6022148 , -0.19275783, -0.54066832,  1.95690678,  0.23993172,
        0.27107843,  2.29409865, -0.70446894, -0.93153835, -0.26430007,
       -0.29887114,  1.83132652,  1.54226746,  0.50651577, -0.51001179])

选项2
使用np.where标识mask

中的位置
i, j = np.where(~mask)
matrix.values[i, j]

array([ 0.6022148 , -0.19275783, -0.54066832,  1.95690678,  0.23993172,
        0.27107843,  2.29409865, -0.70446894, -0.93153835, -0.26430007,
       -0.29887114,  1.83132652,  1.54226746,  0.50651577, -0.51001179])

选项2B
略过面具并坚持上三角形。

i, j = np.triu_indices(len(matrix))
matrix.values[i, j]

array([ 0.6022148 , -0.19275783, -0.54066832,  1.95690678,  0.23993172,
        0.27107843,  2.29409865, -0.70446894, -0.93153835, -0.26430007,
       -0.29887114,  1.83132652,  1.54226746,  0.50651577, -0.51001179])