整数

2016-12-19 8 views
5

としてパンダのデータフレームの列のインデックスは、私は条件を考えると、行のインデックス値を取得するにはどうすればよいの例整数

A   B 
0 1 0.810743 
1 2 0.595866 
2 3 0.154888 
3 4 0.472721 
4 5 0.894525 
5 6 0.978174 
6 7 0.859449 
7 8 0.541247 
8 9 0.232302 
9 10 0.276566 

のために、簡単にデータフレームを仮定しなさい? 例: dfb = df[df['A']==5].index.values.astype(int) [4]が返されますが、私が取得したいのは4です。これはコードの後半で問題を引き起こしています。

いくつかの条件に基づいて、その条件が満たされているインデックスのレコードを取得し、その間で行を選択する必要があります。

私は、所望の出力

A   B 
4 5 0.894525 
5 6 0.978174 
6 7 0.859449 

ため

dfb = df[df['A']==5].index.values.astype(int) 
dfbb = df[df['A']==8].index.values.astype(int) 
df.loc[dfb:dfbb,'B'] 

を試してみましたが、私は簡単にTypeError: '[4]' is an invalid key

答えて

6

を取得[0]を追加することです - 一つの要素で、リストの最初の値を選択します。

dfb = df[df['A']==5].index.values.astype(int)[0] 
dfbb = df[df['A']==8].index.values.astype(int)[0] 

dfb = int(df[df['A']==5].index[0]) 
dfbb = int(df[df['A']==8].index[0]) 

そして、substract 1を必要とするようだ:

print (df.loc[dfb:dfbb-1,'B']) 
4 0.894525 
5 0.978174 
6 0.859449 
Name: B, dtype: float64 

boolean indexingまたはqueryと別の解決策:

print (df[(df['A'] >= 5) & (df['A'] < 8)]) 
    A   B 
4 5 0.894525 
5 6 0.978174 
6 7 0.859449 

print (df.loc[(df['A'] >= 5) & (df['A'] < 8), 'B']) 
4 0.894525 
5 0.978174 
6 0.859449 
Name: B, dtype: float64 

print (df.query('A >= 5 and A < 8')) 
    A   B 
4 5 0.894525 
5 6 0.978174 
6 7 0.859449 
4

自然A == 5とすべての行までがではないの行を含む行を含めると、A == 8の行は、iloclocはスライスの両端を含む)を意味します。

インデックスラベルを取得するには、idxmaxを使用します。これは、最大値の最初の位置を返します。これは、A == 5(次にA == 8の場合)のインデックス値を返すブール値のシリーズで実行されます。A == 5が最初に起きたとき(同じことがA == 8の場合)です。

次に、searchsortedを使用して、インデックスラベル(上記で見つかったもの)がどこにあるのかを調べます。これは私がilocで使用しているものです。


あなたは、さらに根本的なnumpyのを使用してこれを強化することができる

numpyのは、類似したnumpyの機能をオブジェクト

enter image description here

i5, i8 = df.index.searchsorted([df.A.eq(5).idxmax(), df.A.eq(8).idxmax()]) 
df.iloc[i5:i8] 

。私はそれを手軽な関数にまとめました。

def find_between(df, col, v1, v2): 
    vals = df[col].values 
    mx1, mx2 = (vals == v1).argmax(), (vals == v2).argmax() 
    idx = df.index.values 
    i1, i2 = idx.searchsorted([mx1, mx2]) 
    return df.iloc[i1:i2] 

find_between(df, 'A', 5, 8) 

enter image description here


タイミング
enter image description here

6

所望の選択のための整数としてインデックスを取得する方法についての元の質問に答えるために、次のように動作します:

df[df['A']==5].index.item()