Jak uzyskać wartość z komórki ramki danych?

345

Skonstruowałem warunek, który wyodrębnia dokładnie jeden wiersz z mojej ramki danych:

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

Teraz chciałbym wziąć wartość z konkretnej kolumny:

val = d2['col_name']

Ale w rezultacie otrzymuję ramkę danych, która zawiera jeden wiersz i jedną kolumnę ( tj. Jedną komórkę). Nie tego potrzebuję. Potrzebuję jednej wartości (jedna liczba zmiennoprzecinkowa). Jak mogę to zrobić w pandach?

rzymski
źródło
1
Jeśli wypróbowałeś niektóre z tych odpowiedzi, ale skończyło się na tym SettingWithCopyWarning, możesz spojrzeć na ten post, aby uzyskać wyjaśnienie ostrzeżenia i możliwych obejść / rozwiązań.
cs95,

Odpowiedzi:

428

Jeśli masz ramkę danych z tylko jednym wierszem, uzyskaj dostęp do pierwszego (tylko) wiersza jako za pomocą Serii iloc, a następnie do wartości za pomocą nazwy kolumny:

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
Andy Hayden
źródło
1
@Sofolog patrząc na to, nie mam pojęcia. Pytanie jest nieco dziwnie sformułowane, ale brzmi, jakby pierwsza połowa była nieistotna dla drugiej. ( atto naprawdę fajna odpowiedź, choć wydaje mi się to dziwne, że to jak ix:))
Andy Hayden
9
@Sophologist Zgadzam się, że to absurdalne, że jest to wymagane. To również nie działa, gdy próbujesz przekazać warunki warunkowe; my_df.loc[my_df['Col1'] == foo]['Col2']nadal zwraca obiekt typu<class 'pandas.core.series.Series'>
user5359531,
16
Pamiętaj, że to rozwiązanie zwraca serię, a nie wartość!
Atte Juvonen
1
@AtteJuvonen To zależy, jeśli masz duplikaty w indeksie / kolumnach (uwaga w / iat podnosi wyjątek ze zduplikowanymi kolumnami, zgłosi problem).
Andy Hayden,
1
dziwne. Wciąż czytam loc jest dla nazw, a iloc jest dla liczb całkowitych, ale tutaj jest dla mnie zarówno dla liczb całkowitych, jak i imienia
mLstudent33
205

Są to szybki dostęp do skalarów

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
Jeff
źródło
9
Bardzo podoba mi się ta odpowiedź. Ale podczas gdy możesz to zrobić .iloc[-1]['A'], nie możesz zrobić, at[-1,'A']aby uzyskać ostatni wpis w wierszu
hartmut
3
taka powinna być odpowiedź, ponieważ nie kopiujemy w pamięci bezużytecznej linii, aby umieścić w niej tylko jeden element.
bormat
3
@ Hartmut Zawsze możesz to zrobićat[df.index[-1],'A']
cs95
105

Możesz zmienić ramkę danych 1x1 w tablicę numpy, a następnie uzyskać dostęp do pierwszej i jedynej wartości tej tablicy:

val = d2['col_name'].values[0]
Guillaume
źródło
10
Popraw jakość swojej odpowiedzi, dodając nieco więcej wyjaśnień.
Franck Gamess,
Edytuj swoją wstępną odpowiedź za pomocą tego przed utworzeniem komentarza. Dzięki
Franck Gamess
2
Wolę tę metodę i używam jej często. Używany również do użycia .get_values()[0].
aaronpenne,
3
Myślę, że to najlepsza odpowiedź, ponieważ nie zwraca pandas.series i jest najprostsza.
Sean McCarthy
Co to ma przewagę nad metodami oferowanymi przez Pandas?
AMC
28

Większość odpowiedzi używa, ilocco jest dobre do wyboru według pozycji.

Jeśli potrzebujesz wyboru według etykiety, loc byłoby wygodniej.

Aby uzyskać wartość jawnie (ekwiwalent przestarzałej wartości df.get_value („a”, „A”))

# this is also equivalent to df1.at['a','A']
In [55]: df1.loc['a', 'A'] 
Out[55]: 0.13200317033032932
Shihe Zhang
źródło
18

Potrzebowałem wartości jednej komórki, wybranej według nazw kolumn i indeksów. To rozwiązanie działało dla mnie:

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

Natacha
źródło
16

Wygląda jak zmiany po pandach 10.1 / 13.1

Uaktualniłem z 10.1 do 13.1, zanim iloc nie będzie dostępny.

Teraz z 13.1, iloc[0]['label']dostaje tablicę pojedynczej wartości, a nie skalar.

Lubię to:

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

Wynik:

date
2014-02-26 118.2
name:Close, dtype: float64
czas to miłość
źródło
Myślę, że tak powinno być tylko w przypadku serii ze zduplikowanymi wpisami ... w rzeczywistości nie widzę tego, czy możesz podać mały przykład, aby to wykazać?
Andy Hayden,
użyłem pandy 13.x, zarówno iloc [] [] lub iloc [,] wyprowadzają skalar. tylko iloc nie działa z indeksem ujemnym, jak -1
timeislove 10.10.14
Jeśli możesz podać przykład zabawki pokazujący to w odpowiedzi, byłoby to naprawdę pomocne!
Andy Hayden,
5

Najszybsze / najłatwiejsze opcje, jakie znalazłem, są następujące. 501 reprezentuje indeks wiersza.

df.at[501,'column_name']
df.get_value(501,'column_name')
Jroakes
źródło
5
get_valuejest przestarzałe (v0.21.0 RC1 (13 października 2017 r.)) Odnośnik jest tutaj .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

W przypadku pand 0.10, gdzie ilocjest to niemożliwe, odfiltruj a DFi uzyskaj dane pierwszego wiersza dla kolumny VALUE:

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

jeśli filtrowanych jest więcej niż 1 wiersz, uzyskaj wartość pierwszego wiersza. Wystąpi wyjątek, jeśli filtr spowoduje pustą ramkę danych.

Siergiej Sergienko
źródło
3
get_valuejest przestarzałe (v0.21.0 RC1 (13 października 2017 r.)) Odnośnik jest tutaj .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
Ale iatlub atnie można uzyskać wartości na podstawie nazwy kolumny.
sivabudh
4

Nie jestem pewien, czy jest to dobra praktyka, ale zauważyłem, że mogę również uzyskać wartość, rzucając serię jako float.

na przykład

rate

3 0,042679

Nazwa: stopa bezrobocia, dtype: float64

float(rate)

0,0426789

Michael Wei
źródło
Czy to działa również z serią wieloelementową?
Praxiteles
2

Nie musi być skomplikowane:

val = df.loc[df.wd==1, 'col_name'].values[0]
Eduardo Freitas
źródło
-1
df_gdp.columns

Indeks ([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

Su Tingxuan
źródło
4
Czy to odpowiedź czy pytanie?
Vega,
4
Witamy w Stack Overflow! Dziękujemy za fragment kodu, który może zapewnić ograniczoną, natychmiastową pomoc. Właściwe wyjaśnienie znacznie poprawiłoby jego długoterminową wartość , opisując, dlaczego jest to dobre rozwiązanie problemu i uczyniłoby to bardziej użytecznym dla przyszłych czytelników z innymi podobnymi pytaniami. Edytuj swoją odpowiedź, aby dodać wyjaśnienie, w tym przyjęte założenia.
sepehr
Mimo negatywnych głosów ta odpowiedź naprawdę mi pomogła.
CONvid19