Veri çerçevesi hücresinden değer nasıl alınır?


347

Veri çerçevemden tam olarak bir satır ayıklayan bir koşul oluşturdum:

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

Şimdi belirli bir sütundan bir değer almak istiyorum:

val = d2['col_name']

Ama sonuç olarak bir satır ve bir sütun ( yani bir hücre) içeren bir veri çerçevesi alıyorum . İhtiyacım olan bu değil. Bir değere ihtiyacım var (bir kayan sayı). Pandalarda nasıl yapabilirim?


1
Bu yanıtlardan bazılarını denediyseniz ancak a ile sonuçlandıysa , uyarının ve olası geçici çözümlerin / çözümlerin açıklaması için bu gönderiyeSettingWithCopyWarning göz atabilirsiniz .
cs95

Yanıtlar:


430

Yalnızca bir satır içeren bir DataFrame'iniz varsa, ilk (yalnızca) satıra bir Seri olarak ilocve ardından sütun adını kullanan değere erişin :

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
@Sofolog buna bakıyor, hiçbir fikrim yok. Soru biraz garip bir şekilde ifade edildi, ancak ilk yarının ikincisi için önemsiz olduğu anlaşılıyor. ( atbu gerçekten garip bulsam da gerçekten güzel bir cevap ix:))
Andy Hayden

9
@Sofolog Bunun gerekli olduğu saçma olduğuna katılıyorum. Koşulları satır içinde geçirmeye çalıştığınızda da çalışmaz; my_df.loc[my_df['Col1'] == foo]['Col2']hala tür bir nesne döndürüyor<class 'pandas.core.series.Series'>
user5359531 18:16

16
Bu çözümün bir değer değil bir Seri döndürdüğünü unutmayın!
Atte Juvonen

1
@AtteJuvonen Bu, dizininizde / sütunlarınızda yinelenenlerin olmasına bağlı olarak değişir (/ iat'taki not, yinelenen sütunlarda bir istisna oluşturur, sorun oluşturur).
Andy Hayden

1
tuhaf. Ben loc isimleri için ve iloc tamsayılar için okumaya devam ediyorum ama burada hem tamsayı hem de isim için iloc olduğunu
mLstudent33

205

Bunlar skalerlere hızlı erişimdir

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
Bu yanıtı çok beğendim. Ancak yapabileceğiniz gibi son satır girişini almak için .iloc[-1]['A']yapamazsınızat[-1,'A']
hartmut

3
bu cevap olmalı, çünkü içeride sadece bir eleman almak için işe yaramaz bir çizgi kopyalamıyoruz.
bormat

3
@hartmut Her zaman yapabilirsinat[df.index[-1],'A']
cs95

105

1x1 veri çerçevenizi sayısal bir diziye dönüştürebilir, ardından bu dizinin ilk ve tek değerine erişebilirsiniz:

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

10
Lütfen biraz daha açıklama yaparak cevabınızın kalitesini artırın.
Franck Gamess

Yorum oluşturmadan önce bununla ilk cevabınızı düzenleyin. Teşekkürler
Franck Gamess

2
Bu yöntemi tercih ediyorum ve sık kullanıyorum. Kullanım için kullanılır .get_values()[0]de.
aaronpenne

3
Bence bu en iyi cevap çünkü bir pandas.series döndürmez ve en basitidir.
Sean McCarthy

Bunun Pandaların sağladığı yöntemlere göre ne avantajı var?
AMC

28

Çoğu cevap, ilocpozisyona göre seçim için iyi olan kullanmaktadır .

Etikete göre seçim yapmanız gerekirse locdaha uygun olacaktır.

Açıkça bir değer elde etmek için (kullanımdan kaldırılan df.get_value ('a', 'A') ile eşdeğer)

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

18

Sütun ve dizin adlarıyla seçilen bir hücrenin değerine ihtiyacım vardı. Bu çözüm benim için çalıştı:

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


16

Pandalar 10.1 / 13.1'den sonra değişikliklere benziyor

İloc mevcut olmadan önce 10.1'den 13.1'e yükselttim.

Şimdi 13.1 ile, iloc[0]['label']bir skaler yerine tek bir değer dizisi alır.

Bunun gibi:

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

Çıktı:

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

Bence bu sadece yinelenen girişleri olan Seriler için geçerli olmalı ... aslında bunu görmüyorum, bunu göstermek için küçük bir örnek verebilir misiniz?
Andy Hayden

panda 13.x kullandım, hem iloc [] [] ya da iloc [,] bir skaler çıktılar. sadece iloc -1 gibi negatif indeks ile çalışmıyor
timeislove

Cevapta bunu gösteren bir oyuncak örneği verebilirseniz, bu gerçekten yararlı olacaktır!
Andy Hayden

5

Bulduğum en hızlı / en kolay seçenekler şunlardır. 501 satır indeksini temsil eder.

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

5
get_valueşimdi kullanımdan kaldırıldı (v0.21.0 RC1 (13 Ekim 2017)) referans burada .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

Kullanılamayan pandalar 0.10 için, iloca'yı filtreleyin DFve sütun için ilk satır verilerini alın VALUE:

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

1'den fazla satır filtrelenmişse, ilk satır değerini elde edin. Filtre boş veri çerçevesiyle sonuçlanırsa bir istisna olacaktır.


3
get_valueşimdi kullanımdan kaldırıldı (v0.21.0 RC1 (13 Ekim 2017)) referans burada .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

Ancak iatveya atsütun adına göre değeri alamıyor.
sivabudh

4

Bunun iyi bir uygulama olup olmadığından emin değilim, ancak seri olarak döküm yaparak sadece değeri alabileceğimi fark ettim float.

Örneğin

rate

3 0.042679

Adı: Unemployment_rate, dtype: float64

float(rate)

0.0426789


Bu çok elemanlı bir seri ile de çalışıyor mu?
Praxiteles


-1
df_gdp.columns

Dizin ([u'Country ', u'Country Code', u'Gösterge Adı ', u'Gösterge Kodu', 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 = 'nesne')

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

8100000000000,0


4
Bu bir cevap mı yoksa bir soru mu?
Vega

4
Stack Overflow'a hoş geldiniz! Sınırlı ve anında yardım sağlayabilecek kod snippet'i için teşekkür ederiz. Düzgün bir açıklama, bunun neden problem için iyi bir çözüm olduğunu açıklayarak uzun vadeli değerini büyük ölçüde artıracak ve diğer benzer soruları olan gelecekteki okuyucular için daha yararlı hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin.
Sepehr

Olumsuz oylara rağmen, bu cevap aslında bana yardımcı oldu.
CONvid19
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.