【问题标题】:Pandas subtotal with filter to the entire group带有过滤器的 Pandas 小计到整个组
【发布时间】:2020-06-25 13:23:03
【问题描述】:

给定以下数据框:

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")

有没有办法把这两个语句合二为一?

【问题讨论】:

  • 您期望的数据框是什么?

标签: python pandas dataframe filter group-by


【解决方案1】:

您可以使用Series.map 将您的group 映射到来自groupby 的结果:

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

 print (df)

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

【讨论】:

    【解决方案2】:

    您可以使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 2020-09-05
      相关资源
      最近更新 更多