遮罩熊猫DataFrame的下三角部分

时间:2019-01-05 05:03:53

标签: python pandas dataframe

这是我正在生成的数据帧输出,它是一个5 x 5的相关矩阵。

     A         B          C          D          E
A    1.00000  -0.277360   0.653920  -0.479600   0.513890
B   -0.27736   1.000000  -0.790648   0.885801  -0.482763
C    0.65392  -0.790648   1.000000  -0.876451   0.672148
D   -0.47960   0.885801  -0.876451   1.000000  -0.756182
E    0.51389  -0.482763   0.672148  -0.756182   1.000000

我想获得此数据帧的整体平均值,但为此,我需要忽略重复的值(仅保留第一次出现的值)。我尝试使用

df.drop_duplicates(inplace=True)

但是,它返回的df不变,我相信这是因为drop_duplicates()将删除行,但不会用NaN替换单个单元格。

关于如何实现此目标的任何建议? (期望的输出如下)

请注意, 我还需要专门删除== 1 的相关性,因为它们是不必要的。

     A         B          C          D          E
A    NaN      -0.277360   0.653920  -0.479600   0.513890
B    NaN       NaN       -0.790648   0.885801  -0.482763
C    NaN       NaN        NaN       -0.876451   0.672148
D    NaN       NaN        NaN        NaN       -0.756182
E    NaN       NaN        NaN        NaN        NaN     

2 个答案:

答案 0 :(得分:2)

使用tril_indices

进行检查
df.values[np.tril_indices(len(df))]=np.nan
df
    A        B         C         D         E
A NaN -0.27736  0.653920 -0.479600  0.513890
B NaN      NaN -0.790648  0.885801 -0.482763
C NaN      NaN       NaN -0.876451  0.672148
D NaN      NaN       NaN       NaN -0.756182
E NaN      NaN       NaN       NaN       NaN

答案 1 :(得分:2)

使用np.indices的有效屏蔽:

i, j = np.indices(df.shape)
df.values[~(i < j)] = np.nan

df
    A        B         C         D         E
A NaN -0.27736  0.653920 -0.479600  0.513890
B NaN      NaN -0.790648  0.885801 -0.482763
C NaN      NaN       NaN -0.876451  0.672148
D NaN      NaN       NaN       NaN -0.756182
E NaN      NaN       NaN       NaN       NaN

np.nanmean(df.values)
# -0.09372449999999999