Python 熊猫中的maskind数据帧元素

Python 熊猫中的maskind数据帧元素,python,pandas,dataframe,masking,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

我有一个方阵作为数据帧,我想把对角线上的所有值投影成一个系列。我的想法是屏蔽对角线下的所有元素,然后将数据帧转储为一个系列,但它也转储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()

在这个系列中,我得到了所有的上三角值以及对应于下三角的所有NaN值。显然,我理解了一些错误:我已经理解,通过屏蔽数据帧中的某些元素,屏蔽元素将不会被使用。有人知道我怎么做吗?

选项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
识别
掩码中的位置

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

多谢各位。它工作得很好。我知道mask只会更改ppy应用于NaN的值。实际上,方法
pd.DataFrame.mask
pd.DataFrame.where
可以使用第二个参数指定应替换的掩码值。