我已经构建了一个从我的数据框中准确提取一行的条件:
d2 = df[(df['l_ext']==l_ext) & (df['item']==item) & (df['wn']==wn) & (df['wd']==1)]
现在我想从特定列中获取一个值:
val = d2['col_name']
但结果我得到一个包含一行和一列(即一个单元格)的数据框。这不是我需要的。我需要一个值(一个浮点数)。我怎样才能在熊猫中做到这一点?
如果您有一个只有一行的 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
这些是标量的快速访问
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
您可以将 1x1 数据框转换为 numpy 数组,然后访问该数组的第一个也是唯一的值:
val = d2['col_name'].values[0]
大多数答案都使用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
它不需要复杂:
val = df.loc[df.wd==1, 'col_name'].values[0]
我需要一个单元格的值,按列和索引名称选择。这个解决方案对我有用:
original_conversion_frequency.loc[1,:].values[0]
pandas 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
我发现的最快/最简单的选项如下。501 代表行索引。
df.at[501,'column_name']
df.get_value(501,'column_name')
不确定这是否是一个好习惯,但我注意到我也可以通过将系列转换为float
.
例如
rate
3 0.042679
名称:Unemployment_rate,数据类型:float64
float(rate)
0.0426789
df_gdp.columns
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]
8100000000000.0
对于 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')
如果过滤的行多于 1 行,则获取第一行值。如果过滤器导致空数据框,则会出现异常。
将其转换为整数对我有用:
int(sub_df.iloc[0])
我在将 DataFrames 与 MultiIndexes 一起使用时遇到了这个问题,发现挤压很有用。
从文档:
将一维轴对象挤压成标量。
具有单个元素的系列或数据帧被压缩为一个标量。具有单列或单行的 DataFrame 被压缩为一个系列。否则对象不变。
# example for 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[]
也有效(如果您不需要使用条件),那么您仍然 AFAIK 需要指定 MultiIndex 的所有级别。
例子:
> df.at[('ii', 2), ('B', 'b')]
5
我有一个带有 6 级索引和 2 级列的 DataFrame,因此只需要指定外部级别就很有帮助。
这现在已经很老了,但从今天开始,你可以通过简单地修复它
val = float(d2['col_name'].iloc[0])
要将整行的值作为 JSON(而不是 Serie):
row = df.iloc[0]
使用如下to_json
方法:
row.to_json()