我构造了一个条件,从我的数据帧中提取一行:

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

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

val = d2['col_name']

但结果是,我得到的数据帧只包含一行和一列(即一个单元格)。这不是我需要的。我需要一个值(一个浮点数)。在熊猫身上怎么做呢?


当前回答

在以后的版本中,你可以简单地这样做来修复它:

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

其他回答

这并不需要太复杂:

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

大多数答案都是使用iloc,它适合按位置选择。

如果需要按标签选择,loc会更方便。

显式获取值(相当于已弃用 df.get_value (' a ', ' ')) #这也等价于df1.at['a',' a'] 在[55]:df1中。loc [' a ', ' ') [55]: 0.13200317033032932

要获得完整行的值为JSON(而不是一个Serie):

row = df.iloc[0]

像下面这样使用to_json方法:

row.to_json()

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

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

使用.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