如何从数据帧的单元格中获取值?

时间:2013-05-24 07:17:07

标签: python pandas dataframe

我构造了一个从我的数据框中提取一行的条件:

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

现在我想从特定列中获取值:

val = d2['col_name']

但结果我得到一个包含一行和一列的数据帧(一个单元格)。这不是我需要的。我需要一个值(一个浮点数)。我怎么能在熊猫中做到这一点?

13 个答案:

答案 0 :(得分:285)

如果您的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

答案 1 :(得分:138)

这些是标量的快速访问

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

答案 2 :(得分:33)

您可以将1x1数据帧转换为numpy数组,然后访问该数组的第一个也是唯一的值:

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

答案 3 :(得分:15)

大多数答案都使用iloc,这有利于按位置选择。

如果您需要selection-by-label loc会更方便。

  

明确获取值(等同于弃用   df.get_value( '一个', 'A'))

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

答案 4 :(得分:13)

看起来像pandas 10.1 / 13.1

之后的变化

在iloc不可用之前,我从10.1升级到13.1。

现在使用13.1,iloc[0]['label']获取单个值数组而不是标量。

像这样:

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

输出:

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

答案 5 :(得分:12)

不需要太复杂:

val = df.loc[df.wd==1, 'col_name'].values[0]

答案 6 :(得分:6)

我需要一个由列和索引名称选择的单元格的值。 这个解决方案对我有用:

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

答案 7 :(得分:4)

不确定这是不是一个好习惯,但我注意到我也可以通过将该系列视为float来获得该值。

e.g。

rate
  

3 0.042679

     

姓名:Unemployment_rate,dtype:float64

float(rate)
  

0.0426789

答案 8 :(得分:4)

我发现的最快/最简单的选项如下。 501表示行索引。

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

答案 9 :(得分:2)

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

答案 10 :(得分:1)

将其转换为整数对我有用:

int(sub_df.iloc[0])

答案 11 :(得分:0)

要以JSON(而不是Serie)的形式获取完整行的值:

row = df.iloc[0]

像下面这样使用to_json方法:

row.to_json()

答案 12 :(得分:-3)

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