Python 根据高级标准操作值
我有一个类似这样的df: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[
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(替换地图)
?是的