คูณค่าเฉพาะด้วยชุดคอลัมน์ตามเงื่อนไขใน 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
ใช้: PakPopulation.iloc[:, 3: 4 + 2019 -1960].apply(lambda x:-x)? หรือเพียงแค่ -PakPopulation.iloc[:, 3: 4 + 2019 -1960]   -  person Amit Vikram Singh    schedule 23.04.2021
comment
อย่างไรก็ตาม ฉันแปลกใจที่โค้ดของคุณสำหรับ 1960 ไม่มีข้อผิดพลาด บน LHS คุณจะเลือกเฉพาะแถวที่มี Gender = Female ในขณะที่ RHS คุณมีแถวทั้งหมด ดังนั้นความยาวจะไม่ตรงกัน   -  person Amit Vikram Singh    schedule 23.04.2021
comment
ใน LHS เป็นการเลือกแถวทั้งหมดของปี 1960 โดยที่ Gender==Female และบน RHS จะคูณด้วย -1   -  person AyyBeeShafi    schedule 23.04.2021
comment
LHS และ RHS มีความยาวต่างกัน แต่อย่างใดแพนด้าก็สามารถจับคู่ดัชนีแล้วกำหนดได้   -  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