我有这样的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}
我希望仅在ID
和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
答案 0 :(得分:1)
问题看起来像是运算符优先级之一。 &
的优先级高于==
,因此您可以有效地比较'NDVI' & df['Time']
,这会导致给定的错误。
在布尔比较周围使用()
来更改操作顺序并获得所需的结果。
您还需要保留现有值,因为在您编写它的方式中,整个DataFrame将被覆盖。尝试在中间步骤中创建可重用的掩码:
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