1. ホーム
  2. python

pandas データフレームの行のインデックスを整数値で取得する

2023-08-22 03:53:30

質問

簡単なデータフレームを想定して、例えば

    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 . これは、コードの後半で私を悩ませる原因となっています。

ある条件に基づいて、その条件を満たしたインデックスの記録を持ち、その間の行を選択したいのですが。

試してみたところ

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

希望の出力に対して

    A         B
4   5  0.894525
5   6  0.978174
6   7  0.859449

と表示されますが TypeError: '[4]' is an invalid key

どのように解決するのですか?

簡単なのは [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])

しかし、可能な限りいくつかの値が一致しない場合、最初の値が存在しないため、エラーが発生します。

解決策は nextiter で、値が一致しない場合はデフォルトのパラメーターを取得します。

dfb = next(iter(df[df['A']==5].index), 'no match')
print (dfb)
4

dfb = next(iter(df[df['A']==50].index), 'no match')
print (dfb)
no match

では 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