如何从数据框的单元格中获取值?
- 2025-01-13 08:52:00
- admin 原创
- 31
问题描述:
我构建了一个条件,可以从我的数据框中准确提取一行:
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()
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)