Как получить значение из ячейки информационного кадра?


347

Я построил условие, которое извлекает ровно одну строку из моего фрейма данных:

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

Теперь я хотел бы взять значение из определенного столбца:

val = d2['col_name']

Но в результате я получаю фрейм данных, который содержит одну строку и один столбец ( то есть одну ячейку). Это не то, что мне нужно. Мне нужно одно значение (одно число с плавающей запятой). Как я могу сделать это в пандах?


1
Если вы попробовали некоторые из этих ответов, но в итоге получили значок SettingWithCopyWarning, вы можете взглянуть на этот пост для объяснения предупреждения и возможных обходных путей / решений.
cs95

Ответы:


430

Если у вас есть DataFrame только с одной строкой, то получите доступ к первой (только) строке как к Series, используя iloc, а затем к значению, используя имя столбца:

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
@ Софолог, глядя на это, я понятия не имею. Вопрос немного странно сформулирован, но он гласит, что первая половина несущественна для последней. ( atэто действительно хороший ответ, хотя я нахожу странным, что это похоже на ix:))
Энди Хейден,

9
@ Софолог Я согласен, что смешно, что это требуется. Это также не работает, когда вы пытаетесь передать условные выражения inline; my_df.loc[my_df['Col1'] == foo]['Col2']по-прежнему возвращает объект типа<class 'pandas.core.series.Series'>
user5359531

16
Обратите внимание, что это решение возвращает серию, а не значение!
Atte Juvonen

1
@AtteJuvonen Это зависит от того, есть ли у вас дубликаты в индексе / столбцах (примечание в / iat вызывает исключение с дубликатами столбцов, приведет к возникновению проблемы).
Энди Хейден

1
странно. Я продолжаю читать, что loc - для имен, а iloc - для целых чисел, но здесь - iloc как для целых, так и для имен
mLstudent33

205

Это быстрый доступ к скалярам

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
Мне очень нравится этот ответ. Но в то время как вы можете сделать, .iloc[-1]['A']вы не можете сделать, at[-1,'A']чтобы получить последнюю запись строки
Хартмут

3
это должен быть ответ, потому что мы не копируем в память бесполезную строку, чтобы получить только один элемент внутри.
бормат

3
@hartmut Вы всегда можете просто сделатьat[df.index[-1],'A']
cs95

105

Вы можете превратить ваш массив данных 1x1 в пустой массив, а затем получить доступ к первому и единственному значению этого массива:

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

10
Пожалуйста, улучшите качество своего ответа, добавив немного больше объяснений.
Франк Гамесс

Отредактируйте свой первоначальный ответ с этим до создания комментария. Спасибо
Франк Гамесс

2
Я предпочитаю этот метод и использую его часто. Используется .get_values()[0]также.
aaronpenne

3
Я думаю, что это лучший ответ, так как он не возвращает pandas.series, и это самый простой.
Шон Маккарти

Какое преимущество это имеет по сравнению с методами, предоставляемыми Pandas?
AMC

28

Большинство ответов используют, ilocчто хорошо для выбора по позиции.

Если вам нужен выбор по метке, loc было бы удобнее.

Для получения значения в явном виде (эквивалент устаревшего 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

Мне нужно было значение одной ячейки, выбранной по именам столбцов и индексов. Это решение сработало для меня:

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


16

Похоже, изменения после панд 10.1 / 13.1

Я обновил с 10.1 до 13.1, до того, как iloc не доступен.

Теперь с 13.1, iloc[0]['label']получает массив с одним значением, а не скаляр.

Как это:

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

Вывод:

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

Я думаю, что это должно относиться только к серии с дублирующимися записями ... на самом деле, я не вижу этого, не могли бы вы привести небольшой пример, чтобы продемонстрировать это?
Энди Хейден,

я использовал панды 13.x, и iloc [] [] или iloc [,] выдают скаляр. просто iloc не работает с отрицательным индексом, как -1
timeislove

Если вы можете привести игрушечный пример, демонстрирующий это в ответе, это будет очень полезно!
Энди Хейден,

5

Самые быстрые / легкие варианты, которые я нашел, следующие. 501 представляет индекс строки.

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

5
get_valueустарела (v0.21.0 RC1 (13 октября 2017 г.)) ссылка здесь .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

Для панд 0.10, где ilocнедоступен, отфильтруйте a DFи получите данные первой строки для столбца VALUE:

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

если отфильтровано более 1 строки, получите значение первой строки. Будет исключение, если фильтр приведет к пустому фрейму данных.


3
get_valueустарела (v0.21.0 RC1 (13 октября 2017 г.)) ссылка здесь .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

Но iatили atне может получить значение на основе имени столбца.
Sivabudh

4

Не уверен, что это хорошая практика, но я заметил, что могу также получить только значение, приведя серию как float.

например

rate

3 0,042679

Имя: Unemployment_rate, dtype: float64

float(rate)

0.0426789


Это также работает с многоэлементными сериями?
Пракситель


-1
df_gdp.columns

Индекс ([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
Это ответ или вопрос?
Вега

4
Добро пожаловать в стек переполнения! Спасибо за фрагмент кода, который может предоставить некоторую ограниченную, немедленную помощь. Правильное объяснение значительно улучшило бы его долгосрочную ценность , объяснив, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с другими подобными вопросами. Пожалуйста, измените свой ответ, чтобы добавить некоторые объяснения, в том числе предположения, которые вы сделали.
сентября

Несмотря на отрицательные голоса, этот ответ действительно помог мне.
CONvid19
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.