#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:
Несколько подходов:
- Заменяет все нулевые случаи
geometery_error
на ‘no geometry’
df['geometry_error'] = df['geometry_error'].fillna('no geometry')
- Найдите все строки, где
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. Я не знаю, почему это не работает, возможно, это потому, что я считаю что-то незначительным — столбец «ошибки геометрии» не равен нулю, в нем есть «-«, я отредактировал свой исходный пост, но до сих пор не знаю, почему он не работает