将pandas DataFrame中的对角线三角形设置为NaN[英] Set diagonal triangle in pandas DataFrame to NaN

本文是小编为大家收集整理的关于将pandas DataFrame中的对角线三角形设置为NaN的处理方法,想解了将pandas DataFrame中的对角线三角形设置为NaN的问题怎么解决?将pandas DataFrame中的对角线三角形设置为NaN问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

鉴于以下数据框:

import pandas as pd
import numpy as np
a = np.arange(16).reshape(4, 4)
df = pd.DataFrame(data=a, columns=['a','b','c','d'])

我想产生以下结果:

df([[ NaN,  1,  2,  3],
    [ NaN,  NaN,  6,  7],
    [ NaN,  NaN,  NaN, 11],
    [ NaN,  NaN,  NaN,  NaN]])

到目前为止,我已经尝试过使用 np.tril_indicies,但它只适用于将 df 转回 numpy 数组,并且它只适用于整数赋值(不是 np.nan):

il1 = np.tril_indices(4)
a[il1] = 0

给予:

array([[ 0,  1,  2,  3],
       [ 0,  0,  6,  7],
       [ 0,  0,  0, 11],
       [ 0,  0,  0,  0]])

...这几乎是我正在寻找的,但在分配 NaN 时会出错:

ValueError: cannot convert float NaN to integer

同时:

df[il1] = 0

给予:

TypeError: unhashable type: 'numpy.ndarray'

所以如果我想用 NaN 填充数据框的底部三角形,它是否 1) 必须是一个 numpy 数组,或者我可以直接用 pandas 来做到这一点吗?2)有没有办法用 NaN 填充底部三角形,而不是使用 numpy.fill_diagonal 并在整个 DataFrame 中逐行递增偏移量?

另一个失败的解决方案:用零填充 np 数组的对角线,然后在零上屏蔽并重新分配给 np.nan.当它们应该保留为零时,它将对角线上方的零值转换为 NaN!

推荐答案

你需要强制转换为float a,因为NaN的type是float:

import numpy as np
a = np.arange(16).reshape(4, 4).astype(float)
print (a)
[[  0.   1.   2.   3.]
 [  4.   5.   6.   7.]
 [  8.   9.  10.  11.]
 [ 12.  13.  14.  15.]]


il1 = np.tril_indices(4)
a[il1] = np.nan
print (a)
[[ nan   1.   2.   3.]
 [ nan  nan   6.   7.]
 [ nan  nan  nan  11.]
 [ nan  nan  nan  nan]]

df = pd.DataFrame(data=a, columns=['a','b','c','d'])
print (df)
    a    b    c     d
0 NaN  1.0  2.0   3.0
1 NaN  NaN  6.0   7.0
2 NaN  NaN  NaN  11.0
3 NaN  NaN  NaN   NaN

本文地址:https://www.itbaoku.cn/post/1728074.html