首页 > 解决方案 > 带有过滤器的 Pandas 小计到整个组

问题描述

给定以下数据框:

import pandas as pd
import numpy as np
np.random.seed(seed=1)
size=20
df = pd.DataFrame({"group":np.random.choice(["A","B","C"], size),
                   "exclude":np.random.choice(["Yes","No"], size),
                   "value":np.random.randint(0,5,size=20)}).sort_values(["group","value","exclude"])

对于每个组,我需要一列,其中包含不包括特定行的组小计。我正在使用以下命令执行此操作:

df["group_sum"] = df[(df.exclude=="No")].groupby("group")["value"].transform("sum")

不幸的是,对于排除的记录,该列是空的。为了填充它,我正在执行以下操作:

df["group_sum"] = df.groupby("group")["group_sum"].transform("max")

有没有办法将这两个语句合并为一个?

标签: pythonpandasdataframefiltergroup-by

解决方案


您可以使用where保留未选择的行但将它们设置为 NaN 值:

df["group_sum"] = df.where(df.exclude== 'No').groupby("group")["value"].transform(
                    "sum").groupby(df.group).transform("max")

它给:

   group exclude  value  group_sum
2      A      No      0       12.0
6      A      No      0       12.0
10     A      No      0       12.0
5      A     Yes      0       12.0
1      A     Yes      1       12.0
8      A      No      2       12.0
14     A      No      3       12.0
18     A      No      3       12.0
19     A      No      4       12.0
16     B      No      0        4.0
9      B      No      1        4.0
0      B     Yes      1        4.0
4      B     Yes      1        4.0
12     B     Yes      1        4.0
7      B      No      3        4.0
3      B     Yes      4        4.0
17     C      No      1        5.0
13     C     Yes      1        5.0
11     C     Yes      3        5.0
15     C      No      4        5.0

推荐阅读