574

我已经构建了一个从我的数据框中准确提取一行的条件:

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

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

val = d2['col_name']

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

4

15 回答 15

684

如果您有一个只有一行的 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
于 2013-05-24T07:31:09.940 回答
327

这些是标量的快速访问

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
于 2013-05-24T12:58:23.933 回答
220

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

val = d2['col_name'].values[0]
于 2018-06-25T20:03:40.343 回答
41

大多数答案都使用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
于 2017-10-24T02:52:28.307 回答
35

它不需要复杂:

val = df.loc[df.wd==1, 'col_name'].values[0]
于 2020-05-18T06:07:42.310 回答
31

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

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

于 2018-10-27T18:21:00.240 回答
21

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
于 2014-02-28T01:40:11.817 回答
17

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

df.at[501,'column_name']
df.get_value(501,'column_name')
于 2017-09-23T16:41:56.183 回答
7

不确定这是否是一个好习惯,但我注意到我也可以通过将系列转换为float.

例如

rate

3 0.042679

名称:Unemployment_rate,数据类型:float64

float(rate)

0.0426789

于 2016-11-25T01:48:20.523 回答
7
df_gdp.columns

Index([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

于 2018-10-10T18:12:56.253 回答
6

对于 pandas 0.10,其中iloc不可用,过滤 aDF并获取该列的第一行数据VALUE

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

如果过滤的行多于 1 行,则获取第一行值。如果过滤器导致空数据框,则会出现异常。

于 2015-10-15T08:21:00.977 回答
4

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

int(sub_df.iloc[0])
于 2021-01-24T20:08:31.860 回答
2

我在将 DataFrames 与 MultiIndexes 一起使用时遇到了这个问题,发现挤压很有用。

从文档:

将一维轴对象挤压成标量。

具有单个元素的系列或数据帧被压缩为一个标量。具有单列或单行的 DataFrame 被压缩为一个系列。否则对象不变。

# example for DataFrame with MultiIndex
> import pandas as pd

> df = pd.DataFrame(
                    [
                        [1, 2, 3], 
                        [4, 5, 6], 
                        [7, 8, 9]
                    ], 
                    index=pd.MultiIndex.from_tuples( [('i', 1), ('ii', 2), ('iii', 3)] ),
                    columns=pd.MultiIndex.from_tuples( [('A', 'a'), ('B', 'b'), ('C', 'c')] )
)

> df
       A  B  C
       a  b  c
i   1  1  2  3
ii  2  4  5  6
iii 3  7  8  9

> df.loc['ii', 'B']
   b
2  5

> df.loc['ii', 'B'].squeeze()
5

请注意,虽然df.at[]也有效(如果您不需要使用条件),那么您仍然 AFAIK 需要指定 MultiIndex 的所有级别。

例子:

> df.at[('ii', 2), ('B', 'b')]
5

我有一个带有 6 级索引和 2 级列的 DataFrame,因此只需要指定外部级别就很有帮助。

于 2021-12-12T01:44:54.573 回答
0

这现在已经很老了,但从今天开始,你可以通过简单地修复它

val = float(d2['col_name'].iloc[0])
于 2022-02-19T13:35:29.383 回答
-1

要将整行的值作为 JSON(而不是 Serie):

row = df.iloc[0]

使用如下to_json方法:

row.to_json()
于 2020-10-07T13:23:35.520 回答