【问题标题】:Multiply a specific value with a series of columns based on a Condition in Pandas Dataframe根据 Pandas Dataframe 中的条件,将特定值与一系列列相乘
【发布时间】:2021-07-17 05:09:06
【问题描述】:

我有某个国家/地区的数据,这些数据在时间序列中给出了某个年龄段的人口。我试图将女性人口的数量与-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

【问题讨论】:

  • 使用:PakPopulation.iloc[:, 3: 4 + 2019 -1960].apply(lambda x:-x)?或者干脆-PakPopulation.iloc[:, 3: 4 + 2019 -1960]
  • 但是我很惊讶你的1960 代码没有抛出错误。在 LHS 上,您只选择带有 Gender = Female 的行,而在 RHS 上,您拥有所有行,因此长度不匹配。
  • 在 LHS 上,它选择 1960 年 Gender==Female 的所有行,在 RHS 上,它将它们与 -1 相乘
  • LHS 和 RHS 的长度不同,但是 pandas 能够以某种方式匹配索引然后分配。

标签: python pandas time-series


【解决方案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

【讨论】:

    猜你喜欢
    • 2022-11-27
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    相关资源
    最近更新 更多