【问题标题】:Python - Pandas - Groupby conditional on column values in groupPython - Pandas - Groupby 以组中的列值为条件
【发布时间】:2017-02-28 00:51:39
【问题描述】:

我有一个具有以下结构的数据框,其中包含 group_、vals_ 和 dates_ 列。

我想对 group_ 执行 groupby 操作,然后为每个组输出一个以日期为条件的统计信息。例如,关联日期低于某个日期的组内所有 vals_ 的平均值。

我试过了

df_.groupby(group_).agg(lambda x: x[x['date_']< some_date][vals_].mean()) 

但这失败了。我相信这是因为 x 不是数据框而是系列。这个对吗?是否有可能通过 groupby 实现我在这里想要实现的目标?

【问题讨论】:

  • df_.groupby(group_).agg(lambda x: x.loc[x['date_']&lt; some_date, vals_].mean()) 呢?
  • 谢谢。在我尝试这个之前,我刚刚意识到 x 都是类型系列而不是数据框。这是预期的吗?
  • 嗯,好像不行,试试apply而不是agg
  • 谢谢,好的,这是我推理中的大错误。但是,我正在尝试生成基本的汇总统计数据,其中我为每个组获得高于和低于某个日期阈值以及整个日期范围的平均值。此外,我可能想在可能的其他列上输出一些其他汇总统计信息。这种方法有可能吗?
  • 我认为它可以工作,如果有更复杂的尝试自定义函数,如:df_.groupby(group_).apply(f)def f(x): x1 = x.loc[x['date_']&lt; some_date, vals_].mean() return x1

标签: python pandas


【解决方案1】:

你可以换个方式写:

def summary(sub_df):
    bool_before = sub_df["date_"] < some_date
    bool_after = sub_df["date_"] > some_date

    before = sub_df.loc[bool_before, vals_].mean()
    after = sub_df.loc[bool_after, vals_].mean()
    overall = sub_df.loc[:, vals_].mean()

    return pd.Series({"before": before, "after": after, "overall": overall})

result = df_.groupby(group_).apply(summary)

结果是一个数据框,其中包含之前/之后/整体的 3 个平均值。

如果您需要额外的汇总统计信息,您可以在 summary 函数中提供它们。

【讨论】:

  • 您好,潘森,谢谢。你能看到原始问题下的讨论吗?我认为在那种情况下这行不通
  • @clog14 我根据您的新描述调整了答案。您也可以更新您的问题描述吗?
  • 嗨潘森,非常感谢。我将在应用程序中尝试并最终用一个完整的玩具示例更新问题。谢谢堵塞
  • @clog14 好酷 - 刚刚更新了 summary 函数以提高清晰度。
猜你喜欢
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 2023-04-02
  • 2022-09-23
  • 1970-01-01
  • 2017-08-20
  • 2021-02-16
  • 2021-09-02
相关资源
最近更新 更多