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

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

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

val = d2['col_name']

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


当前回答

对于pandas 0.10(其中iloc不可用),过滤DF并获取VALUE列的第一行数据:

df_filt = df[df['C1'] == C1val & df['C2'] == C2val]
result = df_filt.get_value(df_filt.index[0],'VALUE')

如果过滤了多个行,则获取第一行的值。如果筛选结果为空数据帧,则会出现异常。

其他回答

对于pandas 0.10(其中iloc不可用),过滤DF并获取VALUE列的第一行数据:

df_filt = df[df['C1'] == C1val & df['C2'] == C2val]
result = df_filt.get_value(df_filt.index[0],'VALUE')

如果过滤了多个行,则获取第一行的值。如果筛选结果为空数据帧,则会出现异常。

这并不需要太复杂:

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

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

你可以把你的1x1数据帧转换成一个NumPy数组,然后访问该数组的第一个也是唯一的值:

val = d2['col_name'].values[0]

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

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