我有以下数据集
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条件
答案 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