Bagaimana cara mendapatkan nilai dari sel dataframe?


344

Saya telah membangun suatu kondisi yang mengekstrak tepat satu baris dari bingkai data saya:

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

Sekarang saya ingin mengambil nilai dari kolom tertentu:

val = d2['col_name']

Tetapi sebagai hasilnya saya mendapatkan bingkai data yang berisi satu baris dan satu kolom ( yaitu satu sel). Bukan itu yang saya butuhkan. Saya butuh satu nilai (satu angka float). Bagaimana saya bisa melakukannya di panda?


1
Jika Anda mencoba beberapa jawaban ini tetapi berakhir dengan SettingWithCopyWarning, Anda dapat melihat posting ini untuk penjelasan tentang peringatan dan kemungkinan solusi / solusi.
cs95

Jawaban:


428

Jika Anda memiliki DataFrame dengan hanya satu baris, akses baris pertama (hanya) sebagai Seri menggunakan iloc, dan kemudian nilainya menggunakan nama kolom:

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
@Sophologist melihat ini, saya tidak tahu. Pertanyaannya sedikit aneh, tetapi berbunyi seperti paruh pertama tidak penting bagi yang terakhir. ( atadalah jawaban yang sangat bagus, meskipun saya merasa aneh itu seperti ix:))
Andy Hayden

9
@ Ahli Sosiologi Saya setuju bahwa konyol bahwa ini diperlukan. Ini juga tidak berfungsi ketika Anda mencoba untuk melewati conditional inline; my_df.loc[my_df['Col1'] == foo]['Col2']masih mengembalikan objek bertipe<class 'pandas.core.series.Series'>
user5359531

15
Perhatikan bahwa solusi ini mengembalikan Seri, bukan nilai!
Atte Juvonen

1
@AtteJuvonen Itu tergantung jika Anda memiliki duplikat di indeks / kolom Anda (catatan di / iat memunculkan pengecualian dengan kolom duplikat, akan mengajukan masalah).
Andy Hayden

1
aneh. Saya terus membaca loc untuk nama dan iloc adalah untuk integer tetapi di sini saya bukan iloc untuk integer dan nama
mLstudent33

205

Ini adalah akses cepat untuk skalar

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
Saya suka jawaban ini banyak. Tetapi sementara Anda bisa melakukannya, .iloc[-1]['A']Anda tidak bisa melakukannya at[-1,'A']untuk mendapatkan entri baris terakhir
hartmut

3
ini harus menjadi jawaban karena kita tidak menyalin di memori garis yang tidak berguna untuk mendapatkan hanya satu elemen di dalamnya.
bormat

3
@hartmut Anda selalu dapat melakukannyaat[df.index[-1],'A']
cs95

105

Anda dapat mengubah kerangka data 1x1 Anda menjadi array numpy, lalu mengakses nilai pertama dan satu-satunya dari array itu:

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

10
Harap tingkatkan kualitas jawaban Anda dengan sedikit penjelasan.
Franck Gamess

Edit jawaban awal Anda dengan ini sebelum membuat komentar. Terima kasih
Franck Gamess

2
Saya lebih suka metode ini dan sering menggunakannya. Dulu digunakan .get_values()[0]juga.
aaronpenne

3
Saya pikir ini adalah jawaban terbaik karena tidak mengembalikan panda.series, dan ini adalah yang paling sederhana.
Sean McCarthy

Apa keuntungannya dibandingkan metode yang disediakan oleh Panda?
AMC

28

Sebagian besar jawaban menggunakan ilocyang bagus untuk pemilihan berdasarkan posisi.

Jika Anda memerlukan pemilihan-oleh-label loc akan lebih mudah.

Untuk mendapatkan nilai secara eksplisit (sama dengan df.get_value yang tidak digunakan lagi ('a', 'A'))

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

18

Saya membutuhkan nilai satu sel, dipilih oleh nama kolom dan indeks. Solusi ini bekerja untuk saya:

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


16

Sepertinya perubahan setelah panda 10.1 / 13.1

Saya memutakhirkan dari 10.1 ke 13.1, sebelum iloc tidak tersedia.

Sekarang dengan 13.1, iloc[0]['label'] dapatkan array nilai tunggal daripada skalar.

Seperti ini:

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

Keluaran:

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

Saya pikir ini seharusnya hanya menjadi kasus untuk Seri dengan entri duplikat ... pada kenyataannya, saya tidak melihat ini, bisakah Anda memberikan contoh kecil untuk menunjukkan ini?
Andy Hayden

saya menggunakan panda 13.x, baik iloc [] [] atau iloc [,] menghasilkan skalar. hanya iloc tidak bekerja dengan indeks negatif, seperti -1
timeislove

Jika Anda dapat memberikan contoh mainan yang menunjukkan ini dalam jawaban itu akan sangat membantu!
Andy Hayden

5

Opsi tercepat / termudah yang saya temukan adalah sebagai berikut. 501 mewakili indeks baris.

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

5
get_valuesudah ditinggalkan sekarang (v0.21.0 RC1 (13 Oktober 2017)) referensi ada di sini .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

Untuk panda 0.10, jika tidak ilocdapat dihindari, filter a DFdan dapatkan data baris pertama untuk kolom VALUE:

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

jika ada lebih dari 1 baris yang difilter, dapatkan nilai baris pertama. Akan ada pengecualian jika filter menghasilkan bingkai data kosong.


3
get_valuesudah tidak digunakan lagi sekarang (v0.21.0 RC1 (13 Oktober 2017)) referensi ada di sini .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

Tetapi iatatau attidak bisa mendapatkan nilai berdasarkan nama kolom.
sivabudh

4

Tidak yakin apakah ini adalah latihan yang baik, tetapi saya perhatikan saya juga bisa mendapatkan nilai hanya dengan casting seri sebagai float.

misalnya

rate

3 0,042679

Nama: Unemployment_rate, dtype: float64

float(rate)

0,0426789


Apakah itu bekerja dengan seri multi-elemen juga?
Praxiteles


-1
df_gdp.columns

Indeks ([u'Country ', u'Country Code', u'Indicator Name ', u'Indicator Code', u'1960 ', u'1961', 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'1972 ', u'1973', u'1974 ' , u'1975 ', u'1976', u'1977 ', u'1978', u'1979 ', u'1980', u'1981 ', u'1982', u'1982 ', u'1983', u'1984 ' , u'1985 ', u'1986', u'1987 ', u'1988', u'1989 ', u'1990', u'1991 ', u'1992', 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'2008 ', u'2009', u'2010 ', u'2011 ', u'2012', u'2013 ', u'2014', u'2015 ', u'2016'], dtype = 'objek')

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

8100000000000.0


4
Apakah ini jawaban atau pertanyaan?
Vega

4
Selamat Datang di Stack Overflow! Terima kasih atas cuplikan kode, yang mungkin memberikan bantuan terbatas dan segera. Penjelasan yang tepat akan sangat meningkatkan nilai jangka panjangnya dengan menjelaskan mengapa ini adalah solusi yang baik untuk masalah ini, dan akan membuatnya lebih bermanfaat bagi pembaca masa depan dengan pertanyaan serupa lainnya. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, termasuk asumsi yang Anda buat.
sepehr

Meskipun ada suara negatif, jawaban ini sebenarnya membantu saya.
CONvid19
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.