鉴于以下数据框:
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
,但它只适用于转换为numpy数组的df,它只适用于整数赋值(不是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的barf:
ValueError: cannot convert float NaN to integer
而:
df[il1] = 0
得到:
TypeError: unhashable type: 'numpy.ndarray'
因此,如果我想用NaN填充数据帧的底部三角形,它是否必须是一个numpy数组,或者我可以直接使用pandas吗? 2)有没有办法用NaN填充底部三角形而不是使用 numpy.fill_diagonal
并在整个DataFrame中逐行递增偏移量?
另一个失败的解决方案:用零填充np数组的对角线,然后屏蔽零并重新分配给np.nan . 当它们应保留为零时,它将对角线上方的零值转换为NaN!
2 回答
你需要强制转换为
float
a
,因为NaN
的type
是float
:使用np.where的方法 -
样品运行 -