Pandas在数据帧中的字符串旁边获取值

时间:2018-02-08 15:52:55

标签: python pandas

好的,所以我有一个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]

有没有更容易理解的方法来获得这个价值?

由于

2 个答案:

答案 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]