设置列的值,该值等于不为零的列

2024-04-20 07:07:10 发布

您现在位置:Python中文网/ 问答频道 /正文

作为代码的输出,我正在打印一个数据框,其中包含一些已处理的信息(即多个销售团队的绩效报告,以下示例用于说明)

该报告显示了一年中每个季度的绩效,然后计算每个KPI的年度绩效(这是在4年内完成的,但下面的示例仅显示了2020年,以简单起见)

每个KPI的年度绩效假设不同,即一些是每个季度的总和,如销售额。在其他情况下,它是一个信息性KPI,例如团队中的人数,在这种情况下,我希望使用信息设置基于最后一个可用列的值

现在,假设一些团队没有报告他们关于团队成员的信息。这些信息只有在他们报告后才可用,但是,销售数据可以从系统中获得,并且每天都会更新

有求和的列没有问题,因为代码最初对列中的所有值求和。但是,我很难根据列中最后一个可用值设置特定行/列的值。i、 因为这是2020年第三季度的价值,因为第四季度尚未报告但是df.iloc[1, 4] = 4Q4的值是可用的,其报告也是如此

df = pd.DataFrame({
    '2020_Q1': [2, 3, 6, 20, 20],
    '2020_Q2': [2, 3, 6, 20, 20],
    '2020_Q3': [5, 3, 6, 20, 20], 
    '2020_Q4': [5, 4, 6, 20, 20],
    '2021_Q1': [5, 3, 7, 20, 20],
    '2021_Q2': [5, 4, 7, 20, 20],
    '2021_Q3': [5, 4, 0, 20, 20],
}, index = ['People', 'AA', 'BB', 'MM', '$$'])

df
Out[]: 
        2020_Q1  2020_Q2  2020_Q3  2020_Q4  2021_Q1  2021_Q2  2021_Q3
People        2        2        5        5        5        5        5
AA            3        3        3        4        3        4        4
BB            6        6        6        6        7        7        0
MM           20       20       20       20       20       20       20
$$           20       20       20       20       20       20       20

生成报告后,输出应如下所示:

###### Solution code here ######


Out[]: 
        2020_Q1  2020_Q2  2020_Q3  2020_Q4 2020_Total  2021_Q2    2021_Q3  2021_Total
People        2        2        5        5          5        5          5        5 
AA            3        3        3        4          4        4          4        5
BB            6        6        6        7          7        7          0        7
MM           20       20       20       20         80       30         30       60
$$           20       20       20       20         80       30         40       70

到目前为止,我已经尝试了多种方法,但没有找到正确的方法

尝试使用if-elif语句

df.loc[['People':'BB'],'2020 Total'] =  df.iloc[[0,2],3]  if df.iloc[[0,2],3]>0 elif df.iloc[[0,2],2] > 0 df.iloc[[0,2],2] ... else df.iloc[[0,2],1]  

Out[]: 
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

这种方法适用于单行,但不适用于多行

由于我有多行有这种需求,而这是一个大forloop的一部分,因此我希望有一行代码或对多个定义行执行此操作的最简洁的方法。

编辑我从答案中添加了DF代码,以澄清并更好地构建问题,供将来参考


Tags: 方法代码信息df报告团队peopleaa
1条回答
网友
1楼 · 发布于 2024-04-20 07:07:10

我的解决方案是定义在年底计算值的函数,并使用pandas.apply来计算2020_Total

完全可复制的示例:

import pandas as pd

df = pd.DataFrame({
    '2020_Q1': [2, 3, 6, 20, 20],
    '2020_Q2': [2, 3, 6, 20, 20],
    '2020_Q3': [5, 3, 6, 20, 20], 
    '2020_Q4': [5, 4, 0, 20, 20],
}, index = ['People', 'AA', 'BB', 'MM', '$$'])

def compute_end_year_value(row):
    if row.name in ['People', 'AA', 'BB']:
        for val in reversed(row):
            if val > 0:
                return val
        return 0
    return sum(row)

df['2020_Total'] = df.apply(compute_end_year_value, axis = 1)

我不确定您的数据帧的索引是什么样子的,所以您可能需要稍微调整一下函数。其工作原理如下:对于包含财务数据的行,它计算总和;对于包含其他数据的行,它查看反向的值,并取第一个大于0的值

请注意,如果多次运行该函数,它将计算不同的数字,因为它将在计算中包含新列2020_Total。因此,请确保只运行一次,或者调整代码,使其不会成为问题

相关问题 更多 >