我最近一直在使用大熊猫,并且遇到了轻微的僵局..
我有一个pandas数据结构,从.fits文件中读入
d = fits.getdata('filename.fits')
df = pd.DataFrame(np.array(d))
df.columns = map(str.lower, df.columns)
包含列名称,如:' n_ser_f2mf1_f850lp',' n_ser_f3mf2_f850lp' ,' mtot_f2mf1_f850lp' ,' mtot_f3mf2_f850lp' ,' othergalaxycharacteristics_f3mf2_f8530lp'
(如果您感兴趣的话,包含适合星系团的星系的Sersic指数的差异,这些星系由哈勃太空望远镜(使用滤波器F850LP)在多个视野中成像 - > f3mf2意味着星系是在字段3和字段2中,所以我们做valueinfield3 - valueinfield2)
数据结构/值的示例:
a_df = pd.DataFrame(df_RXJ,columns=['global_id','mtot_f2mf1_f850lpser','n_ser_f2mf1_f850lp'])
print (a_df[285:290].head())
global_id mtot_f2mf1_f850lpser n_ser_f2mf1_f850lp
285 286.0 0.812901 -4.5086
286 287.0 0.850700 -1.4044
287 288.0 NaN NaN
288 289.0 -0.598200 2.1634
289 290.0 -0.017500 0.3278
我想将列中包含的数据用作numpy数组,通常我这样做:
n_ser_residuals = df.n_ser_f2mf1_f850lp.values
结果是一个数组:
length(array) = numberofgalaxies
array = [ nan, nan, nan, ..., 0.46969998,
1.48409998, 0.08240002]
但是,我正在使用列名作为字符串(循环遍历不同的值,如:
for p in ['f3mf2, 'f2mf1', otheroverlappingfields]:
col0name = 'n_ser_{}_f850lp'.format(p)
col1name = 'mtot_{}_f850lp'.format(p)
etc
所以要访问我使用的值:
n_ser_residuals = (df[col0name].values)
而是导致长度为1的数组看起来像:
[array([ nan, nan, nan, ..., 0.46969998,
1.48409998, 0.08240002], dtype=float32)]
为什么这种方法会产生不同的输出?如何将此输出转换为列表?
答案 0 :(得分:0)
一切都对我很好(熊猫0.18.1):
In [28]: col0name = 'n_ser_{}_f850lp'.format('f2mf1')
In [29]: col0name
Out[29]: 'n_ser_f2mf1_f850lp'
In [30]: df[col0name]
Out[30]:
285 -4.5086
286 -1.4044
287 NaN
288 2.1634
289 0.3278
Name: n_ser_f2mf1_f850lp, dtype: float64
In [31]: df[col0name].values
Out[31]: array([-4.5086, -1.4044, nan, 2.1634, 0.3278])
In [32]: df[col0name].values[1]
Out[32]: -1.4044000000000001
In [33]: df[col0name].values[2]
Out[33]: nan
In [34]: df[col0name].values[1:5]
Out[34]: array([-1.4044, nan, 2.1634, 0.3278])