根据高级标准操纵值

时间:2017-02-15 16:38:00

标签: 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}

我希望仅在IDTime == TS

时使用替换地图替换我的df中的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

1 个答案:

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