使用两个索引器访问pandas DataFrame中的值

时间:2016-12-18 23:01:23

标签: python pandas dataframe

我有一个包含许多列和行的DataFrame(df)。

我想要做的是访问一列中的值,其他两列中的值与我的索引器匹配。

这就是我现在的代码:

df.loc[df.delays == curr_d, df.prev_delay == prev_d, 'd_stim']

如果不清楚,我的目标是选择'd_stim'列中的值,同一行中的其他值为curr_d(在'delays'中列)和prev_d(在'prev_delay'列中)。

使用loc不起作用。它引发了以下错误:

/home/despo/dbliss/dopa_net/behavioral_experiments/analysis_code/behavior_analysis.py in plot_prev_curr_interaction(data_frames, labels)
   2061             for k, prev_d in enumerate(delays):
   2062                 diff = np.array(df.loc[df.delays == curr_d,
-> 2063                                        df.prev_delay == prev_d, 'd_stim'])
   2064                 ind = ~np.isnan(diff)
   2065                 diff_rad = np.deg2rad(diff[ind])

/usr/local/anaconda/lib/python2.7/site-packages/pandas/core/indexing.py in __getitem__(self, key)
   1292 
   1293         if type(key) is tuple:
-> 1294             return self._getitem_tuple(key)
   1295         else:
   1296             return self._getitem_axis(key, axis=0)

/usr/local/anaconda/lib/python2.7/site-packages/pandas/core/indexing.py in _getitem_tuple(self, tup)
    787 
    788         # no multi-index, so validate all of the indexers
--> 789         self._has_valid_tuple(tup)
    790 
    791         # ugly hack for GH #836

/usr/local/anaconda/lib/python2.7/site-packages/pandas/core/indexing.py in _has_valid_tuple(self, key)
    139         for i, k in enumerate(key):
    140             if i >= self.obj.ndim:
--> 141                 raise IndexingError('Too many indexers')
    142             if not self._has_valid_type(k, i):
    143                 raise ValueError("Location based indexing can only have [%s] "

IndexingError: Too many indexers

访问我需要的数据的适当方法是什么?

1 个答案:

答案 0 :(得分:1)

你的逻辑不起作用有两个原因。

  1. pandas不知道如何处理逗号分隔条件
      

    df.delays == curr_d,df.prev_delay == prev_d

  2. 假设您的意思是and,您需要将它们括在括号中并加入&。这是@ MaxU在评论中的解决方案,除非你没有给我们所有东西,否则应该有效 df.loc[(df.delays == curr_d) & (df.prev_delay == prev_d), 'd_stim'])
  3. 但是,我认为这看起来更漂亮。

    df.query('delays == @curr_d and prev_delay == @prev_d').d_stim
    

    如果这样有效,那么应该是@ MaxU的。如果两者都不起作用,我建议你发布一些样本数据,因为大多数人不喜欢猜测你的数据是什么。