作为代码的输出,我正在打印一个数据框,其中包含一些已处理的信息(即多个销售团队的绩效报告,以下示例用于说明)
该报告显示了一年中每个季度的绩效,然后计算每个KPI的年度绩效(这是在4年内完成的,但下面的示例仅显示了2020年,以简单起见)
每个KPI的年度绩效假设不同,即一些是每个季度的总和,如销售额。在其他情况下,它是一个信息性KPI,例如团队中的人数,在这种情况下,我希望使用信息设置基于最后一个可用列的值
现在,假设一些团队没有报告他们关于团队成员的信息。这些信息只有在他们报告后才可用,但是,销售数据可以从系统中获得,并且每天都会更新
有求和的列没有问题,因为代码最初对列中的所有值求和。但是,我很难根据列中最后一个可用值设置特定行/列的值。i、 因为这是2020年第三季度的价值,因为第四季度尚未报告但是df.iloc[1, 4] = 4
Q4的值是可用的,其报告也是如此
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代码,以澄清并更好地构建问题,供将来参考
我的解决方案是定义在年底计算值的函数,并使用
pandas.apply
来计算2020_Total
列完全可复制的示例:
我不确定您的数据帧的索引是什么样子的,所以您可能需要稍微调整一下函数。其工作原理如下:对于包含财务数据的行,它计算总和;对于包含其他数据的行,它查看反向的值,并取第一个大于0的值
请注意,如果多次运行该函数,它将计算不同的数字,因为它将在计算中包含新列
2020_Total
。因此,请确保只运行一次,或者调整代码,使其不会成为问题相关问题 更多 >
编程相关推荐