好的,所以我有一个pandas数据帧,但是我的行索引不正确,因为数据帧来自read_sql_table,行索引行数。像这样:
scalars
name value
0 p_EXPORT_TEELECE -1.187000e+04
1 MaxCO2Emiss 1.510000e+02
2 ModelType 2.000000e+00
3 CO2EmissCostInObjFunct 0.000000e+00
4 IncludeAdequacyConstr 1.000000e+00
5 IncludeReservesConstr 1.000000e+00
6 ESVMAllowed 1.000000e+00
7 LSESSTAllowed 1.000000e+00
所以我试图获取MaxCO2Emiss的值。在搜索了很长时间之后,我找到了一个获得151值的解决方案,但我不认为这是正确的方法:
maxco2emiss = df.ix[df.index[df['name'] == 'MaxCO2Emiss'].tolist(),1][1]
有没有更容易理解的方法来获得这个价值?
由于
答案 0 :(得分:3)
最简单的是创建Series
并将其用于查找:
s = df.set_index('name')['value']
print (s['MaxCO2Emiss'])
151.0
但是,如果标量选择仅第一个值需要多个相同的name
s,例如iat[0]
,iloc[0]
,values[0]
:
print (df)
name value
0 p_EXPORT_TEELECE -11870.0
1 MaxCO2Emiss 151.0
2 ModelType 2.0
3 CO2EmissCostInObjFunct 0.0
4 CO2EmissCostInObjFunct 1.0
5 IncludeReservesConstr 1.0
6 ESVMAllowed 1.0
7 LSESSTAllowed 1.0
s = df.set_index('name')['value']
print (s['CO2EmissCostInObjFunct'])
CO2EmissCostInObjFunct 0.0
CO2EmissCostInObjFunct 1.0
Name: value, dtype: float64
print (s['CO2EmissCostInObjFunct'].iat[0])
0.0
第一个值的另一个通用解决方案是比较并获取第一个True
的第一个索引,然后按loc
选择:
s = df.loc[(df['name'] == 'CO2EmissCostInObjFunct').idxmax(), 'value']
print (s)
0.0
s = df.loc[(df['name'] == 'MaxCO2Emiss').idxmax(), 'value']
print (s)
151.0
<强>详细强>:
print (df['name'] == 'CO2EmissCostInObjFunct')
0 False
1 False
2 False
3 True
4 True
5 False
6 False
7 False
Name: name, dtype: bool
print ((df['name'] == 'CO2EmissCostInObjFunct').idxmax())
3
print (df['name'] == 'MaxCO2Emiss')
0 False
1 True
2 False
3 False
4 False
5 False
6 False
7 False
Name: name, dtype: bool
print ((df['name'] == 'MaxCO2Emiss').idxmax())
1
编辑:如果要返回一行DataFrame,请添加[]
:
对于多列:
df1 = df.loc[[(df['name'] == 'MaxCO2Emiss').idxmax()], ['value1','value2']]
print (df1)
value1 value2
1 151.0 7
对于所有列:
df2 = df.loc[[(df['name'] == 'MaxCO2Emiss').idxmax()]]
print (df2)
name value1 value2 a
1 MaxCO2Emiss 151.0 7 5.0
如果想要返回Series
:
s1 = df.loc[(df['name'] == 'MaxCO2Emiss').idxmax(), ['value1','value2']]
print (s1)
value1 151
value2 7
Name: 1, dtype: object
s2 = df.loc[(df['name'] == 'MaxCO2Emiss').idxmax()]
print (s2)
name MaxCO2Emiss
value1 151
value2 7
a 5
Name: 1, dtype: object
答案 1 :(得分:1)
<强>发电机强>
可能最快的方法是绕过pandas
:
next(j for i, j in zip(df.name, df.value) if i == 'MaxCO2Emiss')
<强>熊猫强>
pd.DataFrame.loc
专为基于标签的索引而设计。这将返回一个系列,因此它也适用于多个匹配:
df.loc[df['name'] == 'MaxCO2Emiss', 'value']
例如,要获取第一个值,您可以为该系列编制索引,您可以使用.iloc
或.values
:
df.loc[df['name'] == 'MaxCO2Emiss', 'value'].iloc[0]
df.loc[df['name'] == 'MaxCO2Emiss', 'value'].values[0]