2017-02-15 3 views
0

У меня есть ДФ так:Манипулирование значения на основе современных критериев

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 
+3

Кронштейны - 'df.ix [(DF [ 'Index'] == '' НРВИ) & (df ['Time'] == 'TS'), 'ID']. map (replacement_map) '? – Zero

+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 
Смежные вопросы