Python 根据高级标准操作值

Python 根据高级标准操作值,python,pandas,Python,Pandas,我有一个类似这样的df: ID Time Index 1 TS NDVI 2 TS NDVI 1 ES NDVI 1 LS NDII 2 TS NDII 2 ES NDII 我还有一本这样的字典: replacement_map={1:4,2:5} 我只想在Time==TS和Index==NDVI 我正在尝试以下代码: df = df.ix[df['Index'] == 'NDVI' & df[

我有一个类似这样的df:

ID   Time   Index
1    TS     NDVI
2    TS     NDVI
1    ES     NDVI
1    LS     NDII
2    TS     NDII
2    ES     NDII
我还有一本这样的字典:

replacement_map={1:4,2:5}

我只想在
Time==TS
Index==NDVI

我正在尝试以下代码:

df = df.ix[df['Index'] == 'NDVI' & df['Time'] == 'TS', 'ID'].map(replacement_map)
但这也带来了:

TypeError: cannot compare a dtyped [object] array with a scalar of type [bool]
我期望的输出是:

   ID   Time   Index
    4    TS     NDVI
    5    TS     NDVI
    1    ES     NDVI
    1    LS     NDII
    2    TS     NDII
    2    ES     NDII

这个问题看起来像是运算符优先级的问题。
&
的优先级高于
=
,因此您可以有效地比较
'NDVI'和df['Time']
,从而导致给定的错误

围绕布尔比较使用
()
,以更改操作顺序并获得所需结果

您还需要保留现有的值,因为在您编写它的方式中,整个数据帧将被覆盖。尝试在中间步骤中创建可重复使用的掩码:

mask = (df['Index'] == 'NDVI') & (df['Time'] == 'TS')
df.ix[mask, 'ID'] = df.ix[mask, 'ID'].map(replacement_map)
对我来说,这会产生预期的结果:

   ID Time Index
0   4   TS  NDVI
1   5   TS  NDVI
2   1   ES  NDVI
3   1   LS  NDII
4   2   TS  NDII
5   2   ES  NDII

括号-
df.ix[(df['Index']='NDVI')和(df['Time']='TS'),'ID'].map(替换地图)
?是的