У меня есть фрейм данных с большим количеством столбцов и строк (только пример выше), и я пытаюсь создать новый столбец с условным ответом, а не на основе значений в одной строке (все сообщения, которые я прочитал до сих пор похоже, просто относятся к условному созданию столбца на основе значений в другом столбце в той же строке).
Я хочу сравнить столбец Geometry, который является типом данных GeometryArray, с таким же столбцом геометрии того же района двумя годами ранее.
Сформулировано как вопрос: Является ли геометрия района 101 в 1902 году такой же, как у района 101 в 1900 году? ИСТИНА/ЛОЖЬ
df['geometry change from last year'] = np.where(df['geometry'].at[df.index[i]]!= climate[geometry].at[df.index[i-2]], 'True', 'False')
В зависимости от того, как на самом деле организован ваш rows
, вы можете использовать eq вместе с сдвигом.
(частичный ответ от здесь)
Сначала создайте фиктивный фрейм данных:
import pandas as pd
data = {'Year':[1900,1901,1902],
'District':[101,101,101],
'Geometry':[
'POLYGON ((-89.26355 41.32246, -89.26171 41.322))',
'POLYGON ((-89.26355 41.33246, -89.26171 41.322))',
'POLYGON ((-89.26255 41.33246, -89.26171 41.322))'],
}
df = pd.DataFrame(data)
df
Фрейм данных выглядит так:
Year District Geometry
0 1900 101 POLYGON ((-89.26355 41.32246, -89.26171 41.322))
1 1901 101 POLYGON ((-89.26355 41.33246, -89.26171 41.322))
2 1902 101 POLYGON ((-89.26355 41.33246, -89.26171 41.322))
Затем, объединив упомянутые функции:
df['changed'] = df['Geometry'].eq(df['Geometry'].shift(2).bfill().astype(bool)
df
выходы:
Year District Geometry changed
0 1900 101 POLYGON ((-89.26355 41.32246, -89.26171 41.322)) False
1 1901 101 POLYGON ((-89.26355 41.33246, -89.26171 41.322)) True
2 1902 101 POLYGON ((-89.26355 41.33246, -89.26171 41.322)) True
Хотя вам придется взглянуть на самые первые две строки из-за bfill()
, необходимых для сравнения.
Я нашел простой способ сортировки строк, который как бы решает мой предыдущий комментарий (он по-прежнему потребует много ручной проверки, но когда я пробую предоставленный вами код: я получаю следующую ошибку: NotImplementedError: fillna с методом еще нет поддерживается
похоже, ошибка возникает, поскольку есть какая-то проблема со сравнением GeometryArray. Я думаю, что нашел обходной путь, извлекая переменные широты и долготы центральной точки, и я могу запустить две версии приведенного выше кода для координат x и y, но когда я запускаю его, все результаты «Ложь».
Я разобрался! Спасибо. Следуя ссылке на другой пост, которым вы поделились, у меня сработал подход с использованием .ne вместо .eq: df['ColumnB'].ne(df['ColumnB'].shift().bfill()).astype( bool) сработало для меня.
Спасибо, это определенно заставляет меня задуматься. Я предполагаю, что это просто не решает подход к сопоставлению индексов, на который я надеялся, потому что годы и районы не создают одинаковые номера строк, которые можно сдвинуть с заданным значением (т.е. 2 в этом случае).