2016-12-18 3 views
0

多くの列と行を持つDataFrame(df)があります。2つのインデクサを使用してpandas DataFrameの値にアクセスする

私がしたいのは、2つの他の列の値がインデクサーと一致する1つの列の値にアクセスすることです。

これは私のコードは、今のように見えるものです:

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

それが私の目標は、同じ行の他の値はcurr_d(であるため、列'd_stim'内の値を選択することで、明確でない場合には'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

'df.loc [(df.delays == curr_d)&(df.prev_delay == prev_d)、 'd_stim'])'または 'df.loc [(df.delays == curr_d)&(df。あなたが 'prev_delay'カラムを持っていなければ、delays.shift()== prev_d)、 'd_stim'])'? – MaxU

+0

@dbliss。あなたは非常に簡単なブール選択問題を持っており、これはMaxUによって正しく答えられました。 –

答えて

1

ロジックが2つの理由で機能していません。コンマで何をするかわからない

  1. パンダはあなたが括弧内にこれらを包むと&に参加する必要がありandを意味と仮定すると、条件に

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

  2. を分離しました。これはコメント内の@ MaxUの解であり、私たちにすべてを与えていない限りうまくいくはずです。
    df.loc[(df.delays == curr_d) & (df.prev_delay == prev_d), 'd_stim'])

しかし、私はこれがきれいに見えると思います。

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

これがうまくいくなら、@ MaxUはそうするべきです。どちらもうまくいかない場合は、サンプルデータを投稿することをおすすめします。なぜなら、ほとんどのフォークは自分のデータが何かを推測するのが好きではないからです。

関連する問題