我构造了一个条件,从我的数据帧中提取一行:
d2 = df[(df['l_ext']==l_ext) & (df['item']==item) & (df['wn']==wn) & (df['wd']==1)]
现在我想从一个特定的列中取一个值:
val = d2['col_name']
但结果是,我得到的数据帧只包含一行和一列(即一个单元格)。这不是我需要的。我需要一个值(一个浮点数)。在熊猫身上怎么做呢?
我构造了一个条件,从我的数据帧中提取一行:
d2 = df[(df['l_ext']==l_ext) & (df['item']==item) & (df['wn']==wn) & (df['wd']==1)]
现在我想从一个特定的列中取一个值:
val = d2['col_name']
但结果是,我得到的数据帧只包含一行和一列(即一个单元格)。这不是我需要的。我需要一个值(一个浮点数)。在熊猫身上怎么做呢?
当前回答
我在使用MultiIndexes的数据框架时遇到过这种情况,发现squeeze很有用。
从文档中可以看到:
将1维轴对象挤压成标量。 具有单个元素的系列或dataframe被压缩为标量。 具有单列或单行的数据帧被压缩到a 系列。否则,对象不变。
# 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
我有一个六层索引和两层列的数据框架,所以只需要指定外层是非常有用的。
其他回答
将它转换为整数对我有用:
int(sub_df.iloc[0])
你可以把你的1x1数据帧转换成一个NumPy数组,然后访问该数组的第一个也是唯一的值:
val = d2['col_name'].values[0]
这些是标量的快速访问方法:
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
大多数答案都是使用iloc,它适合按位置选择。
如果需要按标签选择,loc会更方便。
显式获取值(相当于已弃用 df.get_value (' a ', ' ')) #这也等价于df1.at['a',' a'] 在[55]:df1中。loc [' a ', ' ') [55]: 0.13200317033032932
我需要一个单元格的值,按列名和索引名选择。 这个解决方案对我很有效:
original_conversion_frequency.loc [1:] . values [0]