データフレームのセルから値を取得するには?

データフレームから正確に1行を抽出する条件を作成しました。

d2 = df[(df['l_ext']==l_ext) & (df['item']==item) & (df['wn']==wn) & (df['wd']==1)]

今度は、特定の列から値を取り出したいと思います。

val = d2['col_name']

しかし,結果として,1つの行と1つの列(つまり,1つのセル)を含むデータフレームが得られました。これは私が必要とするものではありません。私は1つの値(1つの浮動小数点数)が必要です。pandasではどのようにすればよいのでしょうか?

ソリューション

行が1つしかないDataFrameの場合は、ilocを使って最初の(唯一の)行を系列としてアクセスし、次に列名を使って値をアクセスします。

In [3]: sub_df
Out[3]:
          A         B
2 -0.133653 -0.030854

In [4]: sub_df.iloc[0]
Out[4]:
A   -0.133653
B   -0.030854
Name: 2, dtype: float64

In [5]: sub_df.iloc[0]['A']
Out[5]: -0.13365288513107493
解説 (4)

これらは、スカラの高速アクセス

In [15]: df = pandas.DataFrame(numpy.random.randn(5,3),columns=list('ABC'))

In [16]: df
Out[16]: 
          A         B         C
0 -0.074172 -0.090626  0.038272
1 -0.128545  0.762088 -0.714816
2  0.201498 -0.734963  0.558397
3  1.563307 -1.186415  0.848246
4  0.205171  0.962514  0.037709

In [17]: df.iat[0,0]
Out[17]: -0.074171888537611502

In [18]: df.at[0,'A']
Out[18]: -0.074171888537611502
解説 (3)

pandas 10.1/13.1以降の変更点のようです。

10.1から13.1にアップグレードしたら、ilocが使えなくなりました。

13.1になって、iloc[0]['label']がスカラではなく単一値の配列を取得するようになりました。

こんな感じです。

lastprice=stock.iloc[-1]['Close']

出力します。

date
2014-02-26 118.2
name:Close, dtype: float64
解説 (3)