Python的Pandas:从列名输入值作为字符串输入(作为列表/数组)

时间:2016-06-30 21:56:57

标签: python numpy pandas

我最近一直在使用大熊猫,并且遇到了轻微的僵局..

我有一个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)]

为什么这种方法会产生不同的输出?如何将此输出转换为列表?

1 个答案:

答案 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])