我想使用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()
的一种方法,但必须创建具有rowtype2
和intensity
的新数据框架。我想采用快速简单的方法,例如,只需使用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丢下行。