有没有一种方法可以将多索引的pandas DataFrame与一个series连接起来?(内部有重要内容)

2024-10-03 13:23:53 发布

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

这里有相当多的上下文,请耐心听我说。我将提供所有暂定代码的上下文

最近我一直在尝试使用pandas创建基于excel文件的报告。在收集和处理数据之后,我有了一个数据框架,其中包含创建报告所需的数据。我有每个队的档案。大概是这样的:

>>> ddff
    COM  HOURS  POINTS PLANNED_DATE
0   AAA    5.0   10.00   2019-03-01
1   BBB   14.0    4.20   2019-03-01
2   AAA   18.0  289.00   2019-03-01
3   BBB   28.0  317.98   2019-03-01
4   AAA   57.0  160.00   2019-03-01
5   AAA   19.0   34.20   2019-03-01
6   AAA   24.0  112.80   2019-03-01
7   BBB   23.0  197.15   2019-03-01
8   AAA   24.0  331.00   2019-04-01
9   AAA   30.0  315.00   2019-04-30
10  BBB   23.0  490.00   2019-06-30
11  AAA    0.0  440.00   2019-04-01
13  AAA    9.0   93.00   2019-05-31

基于这些数据,我想在以下布局中创建一个excel文件:

TOTAL  Jan     Feb     Mar     Apr     May     Jun     Jul     Aug     Sep     Oct     Nov     Dec
      Orq Env Orq Env Orq Env Orq Env Orq Env Orq Env Orq Env Orq Env Orq Env Orq Env Orq Env Orq Env
TOTAL

根据以下条件进行过滤:

  1. 按月分组(取自“计划日”)
  2. 按类型分组(取自“COM”),其中:如果为AAA,则为其ORQ。如果还有别的,那就是环境
  3. 对于每组,每个字段上的数据必须是“点数”之和除以“小时”之和

我基本上是在尝试自动化我所在团队的生产力计算

好的,这就是全部的上下文。现在是代码

首先,要应用第二条规则,我映射'COM'列:

ddff['COM'] = ddff['COM'].map(lambda x: 'ORQ' if x == 'AAA' else 'ENV')

然后,我基本上试着在一条语句中完成第一条、第二条和第三条规则。这可能不是正确的方法,但它非常有效:

pd.DataFrame(ddff.groupby([ddff['PLANNED_DATE'].dt.strftime('%m'),'COM']).apply(lambda x: x['POINTS'].sum()/x['HOURS'].sum())).T

对于本例,它会产生以下数据帧:

PLANNED_DATE        03                   04         05         06
COM                ENV       ORQ        ORQ        ORQ        ENV
0             7.989692  4.926829  20.111111  10.333333  21.304348

这正是我想要的。我可以映射计划日期,然后再做月份名称。我这里的主要问题是,我希望在这个数据帧中缺少值。例如,如果没有12月份的数据,我希望12月份的ORQ和ENV值为零

我试着用SQL的方式思考如果我可以留下一个包含00到12的表来连接这个,那么对于当前缺少的每个位置,我都会有空值。但是我找不到办法,因为.join和.merge对于包含00到12的系列似乎不起作用。或者至少我在尝试这样做时遇到了麻烦

这是我第一次和熊猫一起工作,所以可能有一些我不知道的共同功能。我在这附近读过很多关于os的答案,但仍然做不到,所以我想这是一个自己问的好时机


Tags: 文件数据代码envcomdateplannedexcel