通过pandas.dataframe的数据填充矩阵,跳过nan



我想使用pd.DataFrame xxx填充矩阵ref,但跳过NaN

print xxx
OUT >> 
   intensity name  rowtype1  rowtype2
0        100    A         1       4.0
1        200    A         2       NaN
2        300    B         3       5.0

然后,我用ref[rowtype,col] = intensity填充矩阵,其中有2个rowtype

ref = np.zeros(shape=(7,4))
for idx, inte, name, r1, r2 in xxx.itertuples():
    ref[r1,idx] = inte
    ref[r2,idx] = inte # error because of NaN in rowtype2
print ref

如何在这里跳过NaN?我知道使用drop.na()的一种方法,但必须创建具有rowtype2intensity的新数据框架。我想采用快速简单的方法,例如,只需使用intensity = 200跳到CC_12,然后使用intensity = 300跳到下一个rowtype2 = 5


附加信息:

1)这是如何创建xxx

prot = ['A','A','B']
calc_m = [1,2,3]
calc_m2 = [4, np.nan,5]
inte = [100,200,300]
xxx = pd.DataFrame({'name' : pd.Series(prot),
                    'rowtype1': pd.Series(calc_m),
                    'rowtype2': pd.Series(calc_m2),
                    'intensity': pd.Series(inte)
                    })

您可以使用 melt 使用此选项,然后使用numpy的索引与使用for for for for loop

设置ref的索引
set = xxx.reset_index().melt(['intensity','index'],['rowtype1','rowtype2']).dropna()
ref[set.value.astype(int).values,set['index'].values] = set.intensity.values

给你

array([[   0.,    0.,    0.,    0.],
       [ 100.,    0.,    0.,    0.],
       [   0.,  200.,    0.,    0.],
       [   0.,    0.,  300.,    0.],
       [ 100.,    0.,    0.,    0.],
       [   0.,    0.,  300.,    0.],
       [   0.,    0.,    0.,    0.]])

我不确定我完全了解您要寻找的行为,但是pandas dropna()命令具有"子集"参数...例如,用NAN丢下所有行在RowType2列中可以使用

完成
xxx.dropna(subset=['rowtype2'],inplace=True)

这样,您只会在Rowtype2列中使用NAN丢下行。

最新更新