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

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]

Natacha
источник
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
timeislove
источник
Я думаю, что это должно относиться только к серии с дублирующимися записями ... на самом деле, я не вижу этого, не могли бы вы привести небольшой пример, чтобы продемонстрировать это?
Энди Хейден,
я использовал панды 13.x, и iloc [] [] или iloc [,] выдают скаляр. просто iloc не работает с отрицательным индексом, как -1
timeislove
Если вы можете привести игрушечный пример, демонстрирующий это в ответе, это будет очень полезно!
Энди Хейден,
5

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

df.at[501,'column_name']
df.get_value(501,'column_name')
jroakes
источник
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

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

Это не должно быть сложным:

val = df.loc[df.wd==1, 'col_name'].values[0]
Эдуардо Фрейтас
источник
-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