Умножьте определенное значение на ряд столбцов на основе условия в Pandas Dataframe.

У меня есть данные об определенной стране, которая дает определенную возрастную группу населения во временном ряду. Я пытаюсь умножить количество женского населения на -1, чтобы отобразить его на другой стороне диаграммы пирамиды. Я добился этого за один год, т.е. 1960 (см. код ниже). Теперь я хочу добиться одинаковых результатов для всех столбцов с 1960 по 2020 год.

PakPopulation.loc[PakPopulation['Gender']=="Female",['1960']]=PakPopulation['1960'].apply(lambda x:-x)

Я также пробовал следующее решение, но не повезло:

PakPopulation.loc[PakPopulation['Gender']=="Female",[:,['1960':'2019']]=PakPopulation[:,['1960':'2019']].apply(lambda x:-x)

Схема:

Country Age Group Gender 1960 1961 1962
XYZ 0-4 Male 5880k 5887k 6998k
XYZ 0-4 Female 5980k 6887k 7998k

person AyyBeeShafi    schedule 23.04.2021    source источник
comment
Используйте 1_? или просто -PakPopulation.iloc[:, 3: 4 + 2019 -1960]   -  person Amit Vikram Singh    schedule 23.04.2021
comment
Однако я удивлен, как ваш код для 1960 не выдает ошибку. В левой части вы выбираете только строку с Gender = Female, в то время как в правой у вас есть все строки, поэтому длина не будет совпадать.   -  person Amit Vikram Singh    schedule 23.04.2021
comment
В левой части выбираются все строки 1960 года, где Пол == Женский, а в правой части они умножаются на -1.   -  person AyyBeeShafi    schedule 23.04.2021
comment
LHS и RHS имеют разную длину, но каким-то образом pandas может сопоставить индекс, а затем присвоить.   -  person Amit Vikram Singh    schedule 23.04.2021


Ответы (1)


Вы можете создать список лет и использовать этот список как часть вашего выбора:

import pandas as pd

PakPopulation = pd.DataFrame({
    'Country': {0: 'XYZ', 1: 'ABC'},
    'Age Group': {0: '0-4', 1: '0-4'},
    'Gender': {0: 'Male', 1: 'Female'},
    '1960': {0: 5880, 1: 5980},
    '1961': {0: 5887, 1: 6887},
    '1962': {0: 6998, 1: 7998},
})

start_year = 1960
end_year = 1962
years_lst = list(map(str, range(start_year, end_year + 1)))
PakPopulation.loc[PakPopulation['Gender'] == "Female", years_lst] = \
    PakPopulation[years_lst].apply(lambda x: -x)

print(PakPopulation)

Выход:

  Country Age Group  Gender  1960  1961  1962
0     XYZ       0-4    Male  5880  5887  6998
1     ABC       0-4  Female -5980 -6887 -7998
person Henry Ecker    schedule 23.04.2021