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

2025-01-13 08:52:00
admin
原创
94
摘要:问题描述:我构建了一个条件,可以从我的数据框中准确提取一行: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()
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用