Как получить значение из ячейки данных?

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

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

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

val = d2['col_name']

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

Ответ 1

Если у вас есть DataFrame только с одной строкой, то используйте первую строку (только) как серию, используя 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

Ответ 2

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

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

Ответ 3

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

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

Для получения значения явно (equiv к устаревшему df.get_value ('a', 'A'))

# this is also equivalent to df1.at['a','A']
In [55]: df1.loc['a', 'A'] 
Out[55]: 0.13200317033032932

Ответ 4

Похоже на изменения после pandas 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

Ответ 5

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

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

Ответ 6

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

например.

rate

3 0.042679

Имя: Unemployment_rate, dtype: float64

float(rate)

0.0426789

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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