如何在Pandas中使用布尔索引

时间:2018-07-05 23:40:49

标签: python pandas indexing boolean

我有一个数据框:

df =

first_stage_anchor_generator {
  grid_anchor_generator {
    scales: [0.25, 0.5, 1.0, 2.0]
    aspect_ratios: [0.25, 1.0, 2.0]
    height_stride: 8 
    width_stride: 8
  }

我的单位也有一系列,定义为

su =

   time  time   b
0   0.0  1.1  21
1   0.1  2.2  22
2   0.2  3.3  23
3   0.3  4.4  24
4   0.4  5.5  24

现在,我想将df.index设置为等于“时间(sal)”值。这些值可以在任何列中,我需要检查。

我可以这样:

time     sal
time    zulu
b        m/s

但是,我的索引看起来像:

 df.index = df.values[:,(df.columns == 'time') & (su.values == 'sal')]

但是,这是一个数组数组。在更大的数据集中,绘图似乎需要更长的时间。如果我对值进行硬编码,则只会得到一个数组:

array([[0.0],
       [0.1],
       [0.2],
       [0.3],
       [0.4]])

我还可以执行以下操作:

df.index = df[0,0]
array([0.0, 0.1, 0.2, 0.3, 0.4])

这会将“ inx”设置为0,然后得到一个数组

inx = ((df.columns == 'time') & (s.values == 'sal')).tolist().index(True)

但是,我不必这样做。我在使用熊猫和布尔索引时使用不正确吗?

我想要:

df =

df.index=df.values[0,inx]

2 个答案:

答案 0 :(得分:1)

据我了解,这就是您所期望的。但是,我将时间名称重命名为time1和time2,否则将无法创建具有相同名称的字典。

df = {'time1': [0.0,0.1,0.2,0.3,0.4], 'time2': [1.1,2.2,3.3,4.4,5.5],'b':[21,22,23,24,24]}
su = {'time1':'sal', 'time2':'zulu', 'b':'m/s'}
indexes = df[su.keys()[su.values().index('sal')]]
df = pd.DataFrame(df, index=indexes, columns=['time1', 'time2', 'b'])
print df

Output

答案 1 :(得分:0)

您的原始DataFrame具有重复的列名,这使操作变得复杂。 尝试修改列的名称。

示例代码

unit = pd.Series(['sal', 'zulu', 'm/s'], index=['time', 'time', 'b'])

>>> df
   time  time     b
0   0.0   1.1  21.0
1   0.1   2.2  22.0
2   0.2   3.3  23.0
3   0.3   4.4  24.0
4   0.4   5.5  25.0

new_col = ['{}({})'.format(df.columns[i], unit[i]) for i in range(len(df.columns))]
>>> new_col 
['time(sal)', 'time(zulu)', 'b(m/s)']
>>> df.columns = new_col
>>> df
   time(sal)  time(zulu)  b(m/s)
0        0.0         1.1    21.0
1        0.1         2.2    22.0
2        0.2         3.3    23.0
3        0.3         4.4    24.0
4        0.4         5.5    25.0
>>> df.index = df['time(sal)'].values
>>> df
     time(sal)  time(zulu)  b(m/s)
0.0        0.0         1.1    21.0
0.1        0.1         2.2    22.0
0.2        0.2         3.3    23.0
0.3        0.3         4.4    24.0
0.4        0.4         5.5    25.0