データフレームのセルから値を取得するにはどうすればよいですか?


344

データフレームから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つの浮動小数点数)が必要です。パンダでどうすればいいですか?


1
これらの回答のいくつかを試したがで終わったSettingWithCopyWarning場合は、この投稿で警告の説明と考えられる回避策/解決策を確認できます。
cs95

回答:


428

行が1つだけのDataFrameがある場合は、最初の(のみ)行にSeriesとしてアクセスし、次に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

1
@社会学者はこれを見て、私にはわからない。質問は少し奇妙な言葉で書かれていますが、前半は後半には重要ではないようです。(at本当にいい答えですが、奇妙なのはix:) のようなものです)
Andy Hayden

9
@社会学者私はこれが必要なのはばかげていることに同意します。また、条件をインラインで渡そうとしても機能しません。my_df.loc[my_df['Col1'] == foo]['Col2']それでもタイプのオブジェクトを返す<class 'pandas.core.series.Series'>
user5359531 '18

15
このソリューションは値ではなくシリーズを返すことに注意してください!
Atte Juvonen 2017

1
@AtteJuvonenこれは、インデックス/列に重複があるかどうかによって異なります(at / iatが重複する列で例外を発生させるため、問題が発生します)。
アンディヘイデン

1
変。locは名前用、ilocは整数用ですが、ここでは整数と名前の両方にilocを使用しています
mLstudent33

205

これらはスカラーへの高速アクセスです

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

9
私はこの答えがとても好きです。あなたが行うことができ、一方、しかし.iloc[-1]['A']、あなたが行うことができないat[-1,'A']最後の行エントリを取得する
ハルトムート・

3
内部に1つの要素のみを取得するために不要な行をメモリにコピーしないため、これが答えになるはずです。
ボーマット

3
@hartmutいつでもできるat[df.index[-1],'A']
cs95

105

1x1データフレームを派手な配列にして、その配列の最初で唯一の値にアクセスできます。

val = d2['col_name'].values[0]

10
もう少し説明して、回答の質を向上させてください。
フランクゲーム

コメントを作成する前に、これで最初の回答を編集してください。おかげで
フランクゲーム2018年

2
私はこの方法を好み、頻繁に使用します。使用にも使用.get_values()[0]
アーロンペンネ

3
これはpandas.seriesを返さず、最も簡単なので、これが最良の答えだと思います。
Sean McCarthy

これは、パンダによって提供される方法よりも優れていますか?
AMC

28

ほとんどの回答はiloc、位置による選択に適したものを使用しています。

ラベルによる選択 が必要な場合locは、より便利です。

値を明示的に取得するため(非推奨のdf.get_value( 'a'、 'A')に相当))

# this is also equivalent to df1.at['a','A']
In [55]: df1.loc['a', 'A'] 
Out[55]: 0.13200317033032932

18

列名とインデックス名で選択された1つのセルの値が必要でした。この解決策は私にとってうまくいきました:

original_conversion_frequency.loc[1,:].values[0]


16

パンダ10.1 / 13.1以降の変更のようです

ilocが利用できなくなる前に10.1から13.1にアップグレードしました。

13.1ではiloc[0]['label']、スカラーではなく単一の値の配列を取得します。

このような:

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

出力:

date
2014-02-26 118.2
name:Close, dtype: float64

これは、重複するエントリがあるシリーズの場合にのみ当てはまると思います...実際、これはわかりません。これを示す簡単な例を挙げていただけますか?
Andy Hayden

私はpandas 13.xを使用しました。iloc[] []またはiloc [、]の両方がスカラーを出力します。ilocだけが-1などの負のインデックスで機能しない
timeislove

答えでこれを示すおもちゃの例をあげることができれば、それは本当に役に立ちます!
Andy Hayden

5

私が見つけた最も速い/最も簡単なオプションは次のとおりです。501は行インデックスを表します。

df.at[501,'column_name']
df.get_value(501,'column_name')

5
get_valueは非推奨になりました(v0.21.0 RC1(2017年10月13日))参照はこちら .get_value and .set_value on Series, DataFrame, Panel, SparseSeries, and SparseDataFrame are deprecated in favor of using .iat[] or .at[] accessors (GH15269)
Shihe Zhang

4

パンダ0.10の場合、ilocは使用不可です。aをフィルターに掛けて、DF列の最初の行のデータを取得しますVALUE

df_filt = df[df['C1'] == C1val & df['C2'] == C2val]
result = df_filt.get_value(df_filt.index[0],'VALUE')

フィルタリングされた行が複数ある場合は、最初の行の値を取得します。フィルターの結果、データフレームが空になる場合は、例外があります。


3
get_valueは現在非推奨です(v0.21.0 RC1(2017年10月13日))参照はこちら .get_value and .set_value on Series, DataFrame, Panel, SparseSeries, and SparseDataFrame are deprecated in favor of using .iat[] or .at[] accessors (GH15269)
Shihe Zhang

しかし、iatまたはatカラム名に基づいて値を取得することはできません。
sivabudh

4

これが良い習慣であるかどうかはわかりませんが、シリーズをとしてキャストすることで値だけを取得できることにも気付きましたfloat

例えば

rate

3 0.042679

名前:Unemployment_rate、dtype:float64

float(rate)

0.0426789


多要素シリーズでも動作しますか?
プラクシテレス


-1
df_gdp.columns

Index([u'Country '、u'Country Code'、u'Indicator Name '、u'Indicator Code'、u'1960 '、u'1961'、u'1962 '、u'1963'、u'1964 ' 、u'1965 '、u'1966'、u'1967 '、u'1968'、u'1969 '、u'1970'、u'1971 '、u'1972'、u'1973 '、u'1974' 、u'1975 '、u'1976'、u'1977 '、u'1978'、u'1979 '、u'1980'、u'1981 '、u'1982'、u'1983 '、u'1984' 、u'1985 '、u'1986'、u'1987 '、u'1988'、u'1989 '、u'1990'、u'1991 '、u'1992'、u'1993 '、u'1994' 、u'1995 '、u'1996'、u'1997 '、u'1998'、u'1999 '、u'2000'、u'2001 '、u'2002'、u'2003 '、u'2004'、u'2005 '、u'2006'、u'2007 '、u'2008'、u'2009 '、u'2010'、 u'2011 '、u'2012'、u'2013 '、u'2014'、u'2015 '、u'2016']、dtype = 'object')

df_gdp[df_gdp["Country Code"] == "USA"]["1996"].values[0]

8100000000000.0


4
これは答えですか、質問ですか?
Vega

4
Stack Overflowへようこそ!コードスニペットをご利用いただきありがとうございます。このコードスニペットは、限られた範囲内ですぐに役立つ可能性があります。適切な説明は、なぜこれが問題の優れた解決策であるかを説明することにより、長期的な価値を大幅に改善し、他の同様の質問を持つ将来の読者にとってさらに役立つでしょう。答えを編集して、仮定を含めて説明を追加してください。
セファー

反対票にもかかわらず、この回答は実際に私を助けました。
CONvid19
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.