Заменять только определенные значения в столбце df на основе определенного значения в другом столбце

#python #pandas #if-statement #replace

#python #pandas #if-оператор #заменить

Вопрос:

У меня есть следующий фрейм данных:

 >>> name   ID     geom                                                geometry_error
0  Lily   1234  POLYGON ((5.351418786 7.471461148, 5.352018786...     overlap
1  Pil    3248  POLYGON ((7.351657486 9.341445548, 1.346718786...     overlap
2  Poli   9734  -                                                     -
0  Lily   1234  POLYGON ((5.351265486 2.471876538, 6.33355018786...   overlap
  

Я хочу «отредактировать» столбец geometry_erro с условием, что если значение geom равно ‘-‘, значение ошибки геометрии будет «нет геометрии», например:

 >>> name   ID     geom                                                geometry_error
0  Lily   1234  POLYGON ((5.351418786 7.471461148, 5.352018786...     overlap
1  Pil    3248  POLYGON ((7.351657486 9.341445548, 1.346718786...     overlap
2  Poli   9734  -                                                     no geometry
0  Lily   1234  POLYGON ((5.351265486 2.471876538, 6.33355018786...   overlap
  

Я пытался сделать это с помощью этого:

 def gg(row):
    if row['geom'] == '-':
        val = 'no geometry generated'   
    return val

df['geometry errors'] = df.apply(gg, axis=1)

>>>UnboundLocalError: local variable 'val' referenced before assignment

  

Я не понимаю, почему я получаю эту ошибку, потому что я использовал это имя переменной val в другой функции в том же скрипте, так почему теперь я получаю это? и, может быть, есть лучший способ сделать это?

Комментарии:

1. ваш val никогда не инициализируется. ваш случай if никогда не выполняется для инициализации значения val

2. @yashshah я не уверен, что понимаю вас

3. ваш код никогда не попадает в регистр if. таким образом, значение val вообще не инициируется. добавьте значение по умолчанию =

4. но в столбце geometry в качестве строки указано ‘-‘

Ответ №1:

Используйте это, красиво и просто. np.where выполняет тест для вас.

Код:

 import numpy as np

# ...

df['geometry_error'] = np.where(df['geom'] == '-', 
                                'no geometry generated', 
                                df['geometry_error'])
  

Вывод:

    name    ID                                               geom  
0  Lily  1234   POLYGON ((5.351418786 7.471461148, 5.352018786))   
1   Pil  3248   POLYGON ((7.351657486 9.341445548, 1.346718786))   
2  Poli  9734                                                  -   
3  Lily  1234  POLYGON ((5.351265486 2.471876538, 6.333550187...   

          geometry_error  
0                overlap  
1                overlap  
2  no geometry generated  
3                overlap
  

Ответ №2:

 df[df['geom'] == '-']['geometry_error'] = 'no geometry generated'
  

Комментарии:

1. можете ли вы указать, что вы делаете в этом утверждении и как это является ответом

Ответ №3:

Несколько подходов:

  1. Заменяет все нулевые случаи geometery_error на ‘no geometry’
 df['geometry_error'] = df['geometry_error'].fillna('no geometry')
  
  1. Найдите все строки, где geom == ‘-‘, и установите для них geometry_error значение «без геометрии»
 df.loc[df['geom'] == '-', 'geometry_error'] = 'no geometry'
  

Я думаю, что ваша функция не работает, потому что вам нужно изменить отступ в инструкции return:

 def gg(row):
    if row['geom'] == '-':
        val = 'no geometry generated'   
        return val
  

Комментарии:

1. Я не знаю, почему это не работает, возможно, это потому, что я считаю что-то незначительным — столбец «ошибки геометрии» не равен нулю, в нем есть «-«, я отредактировал свой исходный пост, но до сих пор не знаю, почему он не работает