如何从数据框架的一个单元格中获取一个值?

我构建了一个条件,从我的数据框架中精确提取一行。

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

现在我想从一个特定的列中提取一个值。

val = d2['col_name']

但结果是我得到了一个包含一行和一列(i.e.一个单元格)的数据框。这并不是我所需要的。我需要一个值(一个浮点数)。我怎样才能在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
评论(4)

这些是对标量的快速访问

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)

你可以把你的1x1数据框架变成一个numpy数组,然后访问这个数组的第一个也是唯一的一个值。

val = d2['col_name'].values[0]
评论(4)

大多数答案都在使用iloc,这很适合按位置选择。

如果你需要 [selection-by-label][1] loc会更方便。

用于显式获取一个值(等同于已废弃的 &gt.df.get_value('a','A')) df.get_value('a','A')) df.get_value('a','A'))

这也相当于df1.at['a','A']。

在[55]中。 df1.loc['a', 'A']

出[55]:df1.loc['a','A'] > 出[55]:df1.loc['a','A'] > 0.13200317033032932

[1]: http://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label

评论(0)

看起来是在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
评论(3)

我需要一个单元格的值,通过列和索引名来选择。 这个解决方案对我来说很有效。

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

评论(0)

我找到的最快速/最简单的选项如下。 501代表行索引。

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

不知道这是否是一个好的做法,但我注意到我也可以通过将系列投掷为 "浮动 "来获得数值。

例如:

rate
rate

3 0.042679

名称: Unemployment_rate, dtype: float64

float(rate)

0.0426789

评论(1)

对于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行被过滤,则获取第一行的值。 如果过滤的结果是空数据框,则会出现异常。

评论(2)
df_gdp.columns

指数([u'国家',u'国家代码',u'指标名称',u'指标代码'。 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

评论(2)