首页 > 解决方案 > 减去重复行熊猫的值

问题描述

我有以下数据框:

Date         Code     Name             Days
23/09/2019   WO       Smith Thomas     1
23/09/2019   RE       Johnson Robert   1
24/09/2019   WO       Smith Thomas     1
24/09/2019   NW       Smith Thomas     0.5
25/09/2019   OP       Johnson Robert   0.5
25/09/2019   GF       Johnson Robert   0.5

如果基于日期和名称列重复,我想检查天数总和是否> 1。如果是,那么我想用另一个来确定最大值,但不要删除任何行,否则做没有什么。

所需的输出将是:

Date         Code     Name             Days
23/09/2019   WO       Smith Thomas     1
23/09/2019   RE       Johnson Robert   1
24/09/2019   WO       Smith Thomas     0.5
24/09/2019   NW       Smith Thomas     0.5
25/09/2019   OP       Johnson Robert   0.5
25/09/2019   GF       Johnson Robert   0.5

有熊猫的方法吗?

我可以使用 Python 循环,但它似乎效率不高

谢谢

标签: pythonpandas

解决方案


如果没有关于您要执行的数值运算的更多详细信息,获得所需结果的唯一方法如下:

df.Days = df.groupby(['Date', 'Name']).Days.transform(
    lambda x: x if len(x) == 1 else 
    [max(i - min(x), min(x)) if sum(x) > 1 else i for i in x])

背后的原因是:

  1. 对所有行Date进行Name分组
  2. 查看该Days列并检查是否有重复项
  3. 如果是这种情况,它将用最小值减去所有值,并在列表中最小值的减法结果之间保持最大值(这是一种防止将最小值减去自身的廉价方法)
    Date    Code    Name    Days
0   23/09/2019  WO  Smith Thomas    1.0
1   23/09/2019  RE  Johnson Robert  1.0
2   24/09/2019  WO  Smith Thomas    0.5
3   24/09/2019  NW  Smith Thomas    0.5
4   25/09/2019  OP  Johnson Robert  0.5
5   25/09/2019  GF  Johnson Robert  0.5

推荐阅读