Заменить несколько значений столбца в одном кадре данных на значения другого кадра данных, подвергнутого столбцу общего ключа - PullRequest
1 голос
/ 23 апреля 2020

Я хочу обновить значения в фрейме данных GeoPanda из другого фрейма данных GeoPanda для выбранных столбцов. У них обоих будет общий ключ, называемый «геометрией».

Например,

df1 = pd.DataFrame([["X",1,1,0],
              ["Y",0,1,0],
              ["Z",0,0,0],
              ["Y",0,0,0]],columns=["geometry","Nonprofit","Business", "Education"])    

df2 = pd.DataFrame([["Y",1,1],
              ["Z",1,1]],columns=["geometry","Non", "Edu"])  

enter image description here

После этого ответ Я сделал следующие шаги:

df1 = df1.set_index('geometry')
df2 = df2.set_index('geometry')

list_1 = ['Nonprofit', 'Education']
list_2 = ['Non', 'Edu']

df1[list_1].update(df2[list_2])

Это приводит к неправильным результатам без предупреждения. Как я могу это исправить?

enter image description here

Примечания:

Обновление по одному столбцу за раз (df1 ['Некоммерческий']. Update (df2 ['Non'])) даст правильный результат.

геометрия Линейная строка из Geo Pandas заменена символом для простоты.

1 Ответ

2 голосов
/ 23 апреля 2020

DataFrame.update обновляет только столбцы с одинаковыми именами!

Соответственно, одним из решений было бы сначала переименовать столбцы в df2, чтобы они соответствовали столбцам в df1.

Обратите внимание, что при вызове update() нет необходимости указывать целевые столбцы в df1: все общие столбцы будут обновлены. При необходимости вы можете указать , какие столбцы вы хотите из df2, используя индексацию столбцов.

df2 = df2.rename(columns={'Non': 'Nonprofit', 'Edu': 'Education'})
df1.update(df2)  

# optionally restrict columns:
# df1.update(df2['Nonprofit'])  

# alternative short version, leaving df2 untouched
df1.update(df2.rename(columns={'Non': 'Nonprofit', 'Edu': 'Education'})) 

дает

          Nonprofit  Business  Education
geometry                                
X               1.0         1        0.0
Y               1.0         1        1.0
Z               1.0         0        1.0
Y               1.0         0        1.0

Причина вашего "единственного столбца "подход работает так: вы неявно используете Series.update , где нет такого понятия, как общие столбцы .

...