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

2025-01-13 08:52:00
admin
原创
33
摘要:问题描述:我构建了一个条件,可以从我的数据框中准确提取一行:d2 = df[(df['l_ext']==l_ext) & (df['item']==item) & (df['wn']==wn) & (df['wd']==1)] 现在我想从特定列中获取一个值:val = d2['col_...

问题描述:

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

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

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

val = d2['col_name']

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


解决方案 1:

如果您有一个只有一行的 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

解决方案 2:

这些是标量的快速访问方法:

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:

它不需要太复杂:

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

解决方案 5:

大多数答案都使用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

解决方案 6:

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

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

解决方案 7:

它看起来像是 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

解决方案 8:

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

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

解决方案 9:

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

val = float(d2['col_name'].iloc[0])

解决方案 10:

df_gdp.columns

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

解决方案 11:

我不确定这是否是一个好的做法,但我注意到我也可以通过将系列转换为来获得价值float

例如,

rate

3 0.042679

名称:Unemployment_rate,数据类型:float64

float(rate)

0.0426789

解决方案 12:

我在使用带有多重索引的数据框时遇到了这个问题,并发现squeeze很有用。

来自文档:

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

只有一个元素的 Series 或 DataFrames 会被压缩为标量。只有一列或一行的 DataFrames 会被压缩为 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

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

例子:

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

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

解决方案 13:

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

df = pd.DataFrame({'A':range(5), 'B': range(5)})
d2 = df[df['A'].le(5) & df['B'].eq(3)]
val = d2['A'].squeeze()                 # 3

val = d2['A'].item()                    # 3

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

msk = df['A'].le(5) & df['B'].eq(3)
val = df.at[df.index[msk].item(), 'B']  # 3

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

df = pd.DataFrame({'A':range(10000), 'B': range(10000)})
msk = df['A'].le(5) & df['B'].eq(3)

%timeit df.at[df.index[msk].item(), 'A']
# 31.4 µs ± 5.83 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit df.loc[msk, 'A'].squeeze()
# 143 µs ± 8.99 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit df.loc[msk, 'A'].item()
# 125 µs ± 1.56 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit df.loc[msk, 'A'].iat[0]
# 125 µs ± 1.96 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit df[msk]['A'].values[0]
# 189 µs ± 8.67 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

解决方案 14:

对于 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')

如果过滤了多行,则获取第一行的值。如果过滤结果为空数据框,则会出现异常。

解决方案 15:

将其转换为整数对我来说有效,但如果您需要浮点数,它也很简单:

int(sub_df.iloc[0])

对于浮点数:

float(sub_df.iloc[0])

解决方案 16:

使用.item()会返回一个标量(而不是Series),并且只有在选定一个元素时才有效。它.values[0]比无论选定多少个元素都会返回第一个元素更安全。

>>> df = pd.DataFrame({'a': [1,2,2], 'b': [4,5,6]})
>>> df[df['a'] == 1]['a']  # Returns a Series
0    1
Name: a, dtype: int64
>>> df[df['a'] == 1]['a'].item()
1
>>> df2 = df[df['a'] == 2]
>>> df2['b']
1    5
2    6
Name: b, dtype: int64
>>> df2['b'].values[0]
5
>>> df2['b'].item()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/pandas/core/base.py", line 331, in item
    raise ValueError("can only convert an array of size 1 to a Python scalar")
ValueError: can only convert an array of size 1 to a Python scalar

解决方案 17:

显示 pandas dataframe 中某个单元格的数据

使用dataframe.iloc

当给定的索引是创建 pandas 数据框时实际的索引时,应该使用 Dataframe.iloc。

避免在自定义索引上使用 dataframe.iloc。

print(df['REVIEWLIST'].iloc[df.index[1]])

使用dataframe.loc

如果您使用自定义索引,请使用 dataframe.loc,它也可以代替 iloc 使用,即使数据框包含默认索引。

print(df['REVIEWLIST'].loc[df.index[1315]])

解决方案 18:

您可以像这样获取值:

df[(df['column1']==any_value) & (df['column2']==any_value) & (df['column']==any_value)]['column_with_values_to_get']

你可以添加(df['columnx']==any_value)任意数量

解决方案 19:

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

row = df.iloc[0]

使用to_json方法如下:

row.to_json()
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1043  
  IPD(Integrated Product Development,集成产品开发)是一种系统化的产品开发方法论,旨在通过跨职能团队的协作,优化产品开发的效率和质量。IPD流程强调从市场需求出发,通过并行工程、跨部门协作和阶段性评审,确保产品从概念到上市的每个环节都高效且可控。随着敏捷开发方法的普及,越来越多的企业开始...
华为IPD流程   41  
  随着企业产品开发复杂度的提升以及市场需求的快速变化,传统的产品开发模式逐渐显现出局限性。集成产品开发(IPD)流程与敏捷开发(Agile Development)作为两种主流的开发方法论,分别从系统化管理和快速响应需求的角度为企业提供了解决方案。然而,单独使用其中一种方法往往无法完全满足企业在效率、质量和创新上的多重需...
华为IPD流程   35  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司成功的关键因素之一。它不仅帮助华为在技术上实现了快速创新,还通过市场导向确保了产品的商业成功。IPD流程通过整合技术与市场双驱动,实现了从需求定义到产品交付的全生命周期管理。这种模式不仅提高了产品的开发效率,还降低了市...
IPD流程中PDCP是什么意思   32  
  在研发领域,集成产品开发(IPD)流程已经成为企业提升创新效率和市场竞争力的重要手段。然而,资源分配的不合理往往是制约IPD流程效率的关键因素之一。无论是人力资源、财务资源还是技术资源,如何高效分配直接关系到项目的成功与否。优化资源分配不仅能够缩短产品开发周期,还能降低研发成本,提升产品的市场竞争力。因此,掌握资源分配...
IPD流程中CDCP   34  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用