2015-06-12 14 views
13

Mam poniżej pokazaną ramkę danych. Potrzebuję uzyskać wartość skalarną kolumny B, w zależności od wartości A (która jest zmienną w moim skrypcie). Próbuję funkcji loc(), ale zwraca Serię zamiast wartości skalarnej. Jak uzyskać wartość skalarną()?Jak uzyskać wartość skalarną na komórce za pomocą warunkowego indeksowania

>>> x = pd.DataFrame({'A' : [0,1,2], 'B' : [4,5,6]}) 
>>> x 
    A B 
0 0 4 
1 1 5 
2 2 6 

>>> x.loc[x['A'] == 2]['B'] 
2 6 
Name: B, dtype: int64 

>>> type(x.loc[x['A'] == 2]['B']) 
<class 'pandas.core.series.Series'> 
+1

możliwe duplikat [Jak uzyskać wartość z komórki ramki danych?] (Http : //stackoverflow.com/questions/16729574/how-to-get-a-value-from-a-cell-of-a-data-frame) – Noah

+0

Zrobiłem przeczytać post, o którym mowa powyżej. Moim problemem jest warunkowa część indeksująca (tj. X ["A"] == 2). Nie wiem, jak sprawić, by działał z at(), iat(). Dzięki. – user4979733

Odpowiedz

14

Przede wszystkim, jesteś lepiej dostępu zarówno indeksy wierszy i kolumn z .loc:

x.loc[x['A'] == 2, 'B'] 

Po drugie, zawsze można dostać w podstawowej numpy matrycy przy użyciu .values na serii lub dataframe:

In : x.loc[x['A'] == 2, 'B'].values[0] 
Out: 6 

UPDATE Jeśli nie jesteś zainteresowany w „warunkowego ind pierwotnego pytania za Exing”, istnieje również specyficzne funkcje zaprojektowane, aby uzyskać pojedynczą wartość skalarną z DataFrame: dataframe.get_value(index, column)

+0

"lepiej mieć dostęp do indeksów wiersza i kolumny z pliku .loc" Zastanawiam się, co jest tego przyczyną. Co masz na myśli? Dlaczego jest to lepsze niż sposób opublikowany w programie operacyjnym? Dzięki: – user5359531

+0

http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy – Noah

+3

Wykonywanie ".values ​​[0]" tylko po to, by uzyskać rzeczywistą wartość komórki. Twórcy pand powinni naprawdę to poprawić. – Jarad

0

Wariant 1
.item()
To działa, jeśli operacje powrotu jednej serii wierszy.

x.loc[x['A'] == 2, 'B'].item() 
6 

Opcja 2
Korzystanie iloc od wyniku loc -

x.loc[x['A'] == 2, 'B'].iloc[0] 
6 
Powiązane problemy