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


343

我构造了一个条件,可以从我的数据帧中准确提取一行:

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

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

val = d2['col_name']

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


1
如果您尝试了其中一些答案,但最后得到一个SettingWithCopyWarning,则可以查看此帖子以获取警告的解释以及可能的解决方法/解决方案。
cs95

Answers:


427

如果您的DataFrame仅包含一行,则使用iloc,以Series的形式访问第一(唯一)行,然后使用列名访问值:

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:))
Andy Hayden

9
@社会学家我同意这是荒谬的,这是必需的。当您尝试通过条件内联时,它也不起作用。my_df.loc[my_df['Col1'] == foo]['Col2']仍然返回类型的对象<class 'pandas.core.series.Series'>
user5359531 2016年

15
请注意,此解决方案返回一个Series,而不是一个值!
Atte Juvonen

1
@AtteJuvonen这取决于您的索引/列是否重复(注意at / 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
这应该是答案,因为我们不会在内存中复制无用的行以仅在其中包含一个元素。
bormat

3
@hartmut您可以随时随地做at[df.index[-1],'A']
cs95

105

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

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

10
请多做一些解释,以提高答案的质量。
Franck Gamess

在创建注释之前,使用此按钮编辑您的初始答案。谢谢
Franck Gamess 18/06/28

2
我更喜欢这种方法并经常使用。过去也使用.get_values()[0]过。
aaronpenne

3
我认为这是最好的答案,因为它不返回pandas.series,而且是最简单的。
肖恩·麦卡锡,

与熊猫提供的方法相比,这有什么优势?
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]


16

熊猫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

我认为这仅适用于具有重复条目的Series ...实际上,我看不到,您能举一个小例子来说明这一点吗?
安迪·海登2014年

我用的是熊猫13.x,iloc [] []或iloc [,]都输出标量。只是iloc无法使用负索引,例如-1
timeislove 2014年

如果您可以举一个玩具示例在答案中证明这一点,那将非常有帮助!
2014年

5

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

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

5
get_value现在已被弃用(v0.21.0 RC1(2017年10月13日))引用在这里 .get_value and .set_value on Series, DataFrame, Panel, SparseSeries, and SparseDataFrame are deprecated in favor of using .iat[] or .at[] accessors (GH15269)
浉张

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(2017年10月13日))参考在这里 .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

但是iatat无法基于列名获取值。
sivabudh

4

不知道这是否是一个好习惯,但是我注意到我也可以通过将序列强制转换为来获得值float

例如

rate

3 0.042679

名称:Unemployment_rate,dtype:float64

float(rate)

0.0426789


这也适用于多元素系列吗?
Praxiteles


-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
欢迎使用Stack Overflow!感谢您提供的代码段,它们可能会提供一些有限的即时帮助。通过描述为什么这是一个很好的解决方案的方法,正确的解释将大大提高其长期价值,并且对于将来有其他类似问题的读者来说,它将更加有用。请编辑您的答案以添加一些解释,包括您所做的假设。
sepehr

尽管投票否决,这个答案实际上对我有所帮助。
CONvid19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.