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?


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

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

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]

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

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]


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

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')

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.


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


Czy to działa również z serią wieloelementową?
Praxiteles


-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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.