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

Rom*_*man 293 python dataframe pandas

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

d2 = df[(df['l_ext']==l_ext) & (df['item']==item) & (df['wn']==wn) & (df['wd']==1)]
Run Code Online (Sandbox Code Playgroud)

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

val = d2['col_name']
Run Code Online (Sandbox Code Playgroud)

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

And*_*den 358

如果您只有一行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
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此解决方案返回一个Series,而不是一个值! (10认同)
  • @Sophologist我同意这是必要的荒谬.当您尝试内联传递条件时,它也不起作用; `my_df.loc [my_df ['Col1'] == foo] ['Col2']`仍然返回一个类型为`<class'pandas.core.series.Series'>`的对象 (7认同)
  • @mLstudent33 对行的调用是iloc,然后给出列名 (5认同)

Jef*_*eff 174

这些是标量的快速访问

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
Run Code Online (Sandbox Code Playgroud)

  • 我非常喜欢这个答案.但是你可以做`.iloc [-1] ['A']`你不能在`-1,'A']`来获取最后一行 (7认同)
  • @hartmut您总是可以执行at [df.index [-1],'A']` (3认同)
  • 我最喜欢这个答案。您还可以引用命名索引,这使您的代码更具可读性:`df.at['my_row_name', 'my_column_name']` (3认同)
  • 这应该是答案,因为我们不会在内存中复制一条无用的行来获取内部只有一个元素. (2认同)

Gui*_*ume 61

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

val = d2['col_name'].values[0]
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是最好的答案,因为它不返回 pandas.series,而且它是最简单的。 (6认同)
  • 请通过更多解释来提高答案的质量. (5认同)
  • 我更喜欢这种方法并经常使用。过去也使用`.get_values()[0]`。 (2认同)
  • 与 Pandas 提供的方法相比,这有什么优势? (2认同)
  • 到目前为止,这也适用于 pandas,不需要比 pandas 中可用的方法有优势,它是 pandas 中可用的方法。 (2认同)

Edu*_*tas 26

它不需要很复杂:

val = df.loc[df.wd==1, 'col_name'].values[0]
Run Code Online (Sandbox Code Playgroud)


Shi*_*ang 25

大多数答案都是使用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
Run Code Online (Sandbox Code Playgroud)


tim*_*ove 15

它看起来像是pandas 10.1/13.1之后的变化

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

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

像这样:

lastprice=stock.iloc[-1]['Close']
Run Code Online (Sandbox Code Playgroud)

输出:

date
2014-02-26 118.2
name:Close, dtype: float64
Run Code Online (Sandbox Code Playgroud)


Nat*_*cha 15

我需要一个由列和索引名称选择的单元格的值。此解决方案为我工作:

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

  • 这会创建一个切片,这可能会消耗内存 (2认同)

小智 12

在更高版本中,您可以通过简单地执行以下操作来修复它:

val = float(d2['col_name'].iloc[0])
Run Code Online (Sandbox Code Playgroud)


小智 7

我在使用带有多重索引的数据帧时遇到过这个问题,并发现挤压很有用。

从文档中:

将一维轴对象压缩为标量。

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

# Example for a 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
Run Code Online (Sandbox Code Playgroud)

请注意,虽然df.at[]也可以(如果您不需要使用条件),但据我所知,您仍然需要指定 MultiIndex 的所有级别。

例子:

> df.at[('ii', 2), ('B', 'b')]
5
Run Code Online (Sandbox Code Playgroud)

我有一个具有六级索引和两级列的数据框,因此只需指定外部级别就非常有帮助。


Ser*_*nko 5

对于 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')
Run Code Online (Sandbox Code Playgroud)

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

  • `get_value` 现在已弃用(v0.21.0 RC1(2017 年 10 月 13 日))[参考在这里](https://pandas-docs.github.io/pandas-docs-travis/whatsnew.html#deprecations)`。不推荐使用 Series、DataFrame、Panel、SparseSeries 和 SparseDataFrame 上的 get_value 和 .set_value 以支持使用 .iat[] 或 .at[] 访问器(GH15269)` (3认同)

小智 5

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

例如

rate
Run Code Online (Sandbox Code Playgroud)

3 0.042679

名称:Unemployment_rate,dtype:float64

float(rate)
Run Code Online (Sandbox Code Playgroud)

0.0426789

  • 这也适用于多元素系列吗? (2认同)

jro*_*kes 5

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

df.at[501,'column_name']
df.get_value(501,'column_name')
Run Code Online (Sandbox Code Playgroud)

  • 现在不推荐使用get_value(v0.21.0 RC1(2017年10月13日))[此处是参考](https://pandas-docs.github.io/pandas-docs-travis/whatsnew.html#deprecations)`。不推荐使用Series,DataFrame,Panel,SparseSeries和SparseDataFrame上的get_value和.set_value,而建议使用.iat []或.at []访问器(GH15269)` (4认同)

Su *_*uan 5

df_gdp.columns
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)

8100000000000.0

  • 这是一个答案还是一个问题? (5认同)
  • 欢迎使用堆栈溢出!感谢您提供代码片段,它可能会提供一些有限的、即时的帮助。通过描述为什么这是一个很好的问题解决方案,适当的解释将大大提高其[长期价值](https://meta.stackexchange.com/q/114762/206345),并使其对未来更有用有其他类似问题的读者。请编辑您的答案以添加一些解释,包括您所做的假设。 (4认同)
  • 尽管投了反对票,这个答案实际上对我有帮助。 (2认同)

cot*_*ail 5

如果从数据帧中过滤出单行,则从单个单元格获取标量值的一种方法是squeeze()(或item()):

\n
df = pd.DataFrame({\'A\':range(5), \'B\': range(5)})\nd2 = df[df[\'A\'].le(5) & df[\'B\'].eq(3)]\nval = d2[\'A\'].squeeze()                 # 3\n\nval = d2[\'A\'].item()                    # 3\n
Run Code Online (Sandbox Code Playgroud)\n

事实上,item()可能会在索引上调用,所以item+at组合可以工作。

\n
msk = df[\'A\'].le(5) & df[\'B\'].eq(3)\nval = df.at[df.index[msk].item(), \'B\']  # 3\n
Run Code Online (Sandbox Code Playgroud)\n

事实上,后一种方法比此处列出的获取单个单元格值的任何其他方法都要快得多。

\n
df = pd.DataFrame({\'A\':range(10000), \'B\': range(10000)})\nmsk = df[\'A\'].le(5) & df[\'B\'].eq(3)\n\n%timeit df.at[df.index[msk].item(), \'A\']\n# 31.4 \xc2\xb5s \xc2\xb1 5.83 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 10,000 loops each)\n%timeit df.loc[msk, \'A\'].squeeze()\n# 143 \xc2\xb5s \xc2\xb1 8.99 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 10,000 loops each)\n%timeit df.loc[msk, \'A\'].item()\n# 125 \xc2\xb5s \xc2\xb1 1.56 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 10,000 loops each)\n%timeit df.loc[msk, \'A\'].iat[0]\n# 125 \xc2\xb5s \xc2\xb1 1.96 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 10,000 loops each)\n%timeit df[msk][\'A\'].values[0]\n# 189 \xc2\xb5s \xc2\xb1 8.67 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 10,000 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n