【问题标题】:Comparing Values in Multiple Columns and Returning all Declining Regions比较多列中的值并返回所有下降区域
【发布时间】:2021-07-16 18:00:45
【问题描述】:

我有一个类似于以下的数据框,假设我有两个不同年份的不同地区的销售额:

Company 2021 Region 1 Sales 2021 Region 2 Sales 2020 Region 1 Sales 2020 Region 2 Sales
Company 1 300000 150000 250000 149000
Company 2 10000 17000 100000 80000
Company 3 12000 20000 22000 90000

我想比较每个地区每年的情况,以确定哪些地区在 2021 年有所下降。需要注意的是,地区销售额必须至少为 25,000 美元才能计算在内。因此,我希望添加一个新列,其中包含 2021 年销售额低于 25,000 美元但 2020 年销售额超过 25,000 美元的所有地区名称。输出将如下所示,尽管会有更多列或“地区”比较大于 2。

Company 2021 Region 1 Sales 2021 Region 2 Sales 2020 Region 1 Sales 2020 Region 2 Sales 2021 Lost Regions
Company 1 300000 150000 250000 149000 None
Company 2 10000 17000 100000 80000 Region 1; Region 2
Company 3 12000 20000 22000 90000 Region 2

提前感谢您的任何帮助,不要急于求成。希望有一种简洁的方法可以做到这一点,而无需使用 if-then 并写出很多组合。

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:
    number_of_regions = 2 # You have to change this
    def find_declined_regions(row):
        result = []
        for i in range(1, number_of_regions+1):
            if row[f"2021 Region {i} Sales"] < 25000 and row[f"2020 Region {i} Sales"] > 25000:
               result.append(f"Region {i}")
        return "; ".join(result)
    
    df.apply(find_declined_regions, axis=1)    
    

    df 是您的 DataFrame,您必须根据您的问题更改 number_of_regions

    编辑: 如果列名都不同,有两种情况:

    1- 你有一个所有地区的列表,所以你可以这样做:

    for region in all_regions:
            if row[f"2021 {region} Sales"] < 25000 and row[f"2020 {region} Sales"] > 25000:
    

    2- 您没有所有区域的列表,因此您必须创建一个:

    all_regions = [col[5:-6] for col in df.columns[1:int(len(df.columns)/2)+1]]
    

    【讨论】:

    • 非常感谢您。当您有机会时,出于学习目的的一个问题......如果列名都不同,这个循环将如何工作?例如,如果我有西北销售、东南销售等,而不是区域 1、区域 2 等。
    • 编辑了答案@nb1214
    • 非常感谢,在结合原始答案和编辑时仍然很困惑,但我现在有我需要弄清楚的东西。
    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 2023-03-11
    • 2020-01-22
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多