如何仅更改熊猫数据框中仅具有一定数量的总和的组的最大值

时间:2020-07-30 09:46:26

标签: python pandas

我有以下数据集

Item Count
A    60
A    20
A    21
B    35
B    33
B    32
C    40
C    40
C    10

要复制的代码:

import pandas as pd
df = pd.DataFrame([
    ['A', 60],
    ['A', 20],
    ['A', 21],
    ['B', 35],
    ['B', 33],
    ['B', 32],
    ['C', 40],
    ['C', 40],
    ['C', 10],
], 
    columns=['Item', 'Count'])

所以在这里我们可以看到“项目总和”列为:A:101,B:100,C:90 现在,我希望“项目”列的所有组的总和为100或小于100,并从组的最高值减少多余的数字。

输出应如下所示:

Item Count
A    59
A    20
A    21
B    35
B    33
B    32
C    40
C    40
C    10

我尝试过。

idx = df.groupby("Item")["Count"].idxmax()
df.loc[idx, "Count"] -= ((df.groupby(['Item'])['Count'].transform(lambda x: x.sum())) - 100)

但是所有组的最高值都减去了100。我不能仅对总和大于100的组使用IF条件

2 个答案:

答案 0 :(得分:2)

代码检查每一行,以查看分组总和是否大于100,如果是,则在组中寻找最大值,并减去总和与100之差。 assign方法。

(
    df.assign(
        counter=df.groupby("Item").Count.transform("sum"),
        maximum=df.groupby("Item").Count.transform("max"),
        Count=lambda x: np.where(
            x.counter.gt(100) & (x.Count.eq(x.maximum)),
            x.Count.sub(x.counter.sub(100)),
            x.Count,
        ),
    ).iloc[:, :2]
)

  Item  Count
0   A   59
1   A   20
2   A   21
3   B   35
4   B   33
5   B   32
6   C   40
7   C   40
8   C   10

答案 1 :(得分:1)

df.transform与groupby一起使用:

>>> df.assign(
              Count=
                     df.groupby('Item',as_index=False)
                       .transform(lambda x:
                                  x.where(x!=x.max(), x-(x.sum()-100)) if x.sum()>100
                                                                      else x)
              )
  Item  Count
0    A   59.0
1    A   20.0
2    A   21.0
3    B   35.0
4    B   33.0
5    B   32.0
6    C   40.0
7    C   40.0
8    C   10.0