2017-02-27 268 views
0

我有一个数据框,其结构为列group_,vals_和dates_。Python - Pandas - Groupby条件组中的列值

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

我试图

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

但这种失败。我相信这是因为x不是一个数据框,而是一个系列。它是否正确?是否有可能通过groupby实现我在这里实现的目标?

+0

'df_.groupby(group _)。agg(lambda x:x.loc [x ['date _'] jezrael

+0

谢谢。在我尝试这个之前,我刚刚意识到x是所有类型系列而不是数据框。这是预期的吗? – clog14

+0

嗯,它似乎不是,尝试'应用'而不是'agg' – jezrael

回答

0

可以不同地写:

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函数内提供它们。

+0

嗨Pansen,谢谢。你能看到原始问题下的讨论吗?我认为这不会在那种情况下工作 – clog14

+0

@ clog14我调整了我对你的新描述的答案。你能否更新你的问题描述? – pansen

+0

嗨潘森,非常感谢。我会在应用程序中尝试,并最终用一个完整的玩具示例更新问题。 thx clog – clog14