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

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

我有一个六层索引和两层列的数据框架,所以只需要指定外层是非常有用的。

其他回答

我不确定这是否是一个好的实践,但我注意到我也可以通过将该系列转换为float来获得值。

例如,

rate

3 0.042679

名称:Unemployment_rate, dtype: float64

float(rate)

0.0426789

对于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')

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

将它转换为整数对我有用:

int(sub_df.iloc[0])

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

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

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

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