【问题标题】:groupby pandas for mean and sum under certain conditiongroupby pandas 在特定条件下的均值和总和
【发布时间】:2021-10-18 23:03:58
【问题描述】:

我正在尝试为包含数百列的非常大的数据框生成汇总统计信息,并总结它们与感兴趣的“结果”的关系。可以使用以下代码生成一个简化的数据框:

df1 = pd.DataFrame({"time1": [0, 1, 1, 0, 0],
                    "time2": [1, 0, 0, 0, 1],
                    "time3": [0, 0, 0, 1, 0],
                    "outcome": [1, 0, 0, 1, 0]})

我想做的是为每一列确定它们与结果特征在比例和总和方面的关系。

目前,我一次做几列如下:

df1 = df1.groupby("outcome")[["time1", "time2", "time3"]].agg(["mean", "sum"]).reset_index()
      
df1[df1["outcome"] == 1].T

这导致了一个相当混乱的数据框,如下所示:

                1
outcome       1.0
time1   mean  0.0
        sum   0.0
time2   mean  0.5
        sum   1.0
time3   mean  0.5
        sum   1.0

如何改进此输出以显示每列的平均值和各列的总和?类似于下面显示的输出。

       mean  sum
time1     0    0
time2   0.5    1
time3   0.5    1

理想情况下,我想对数据框中的数百列执行此操作,并评估它们与结果的关系。

那么有人可以指导我找到一个解决方案,让我可以为数百列执行此操作(无需单独输入他们的名称将是解决方案)并将结果显示在一个干净的数据框中,如上面的示例输出所示?非常感谢!

【问题讨论】:

  • 在混乱的数据框之后尝试unstack。或者,看看pd.pivot_table
  • 谢谢萨米! Unstuck 有帮助,但它仍然需要我在上面的代码中输入每个列名。

标签: pandas dataframe group-by


【解决方案1】:

正如@sammywemmy 所说,我们可以在计算值后unstack。我们也可以使用loc而不是reset_index从索引中选择outcome==1

df1 = (
    df1.groupby("outcome")
        .agg(["mean", "sum"])  # Perform Aggregations
        .loc[1]  # Select outcome==1 from index
        .unstack()  # convert index to columns
)

我们还可以过滤 之前 groupby agg 然后 stackdroplevel

df1 = (
    df1[df1["outcome"] == 1]  # Filter DataFrame
        .groupby("outcome")  # Groupby
        .agg(["mean", "sum"])  # Perform Aggregations
        .stack(0)  # Convert columns to rows
        .droplevel(0)  # Drop outcome==1
)

或者set_index + stack 然后groupby agg 在索引上:

df1 = (
    df1.set_index('outcome').stack()  # Convert time columns to rows
        .groupby(level=[0, 1])  # Groupby
        .agg(['mean', 'sum'])  # Perform Aggregations
        .loc[1]  # Select outcome==1 from index
)

或者用pivot_table和多个聚合函数:

df1 = (
    df1.pivot_table(index='outcome', aggfunc=['mean', 'sum'])
        .loc[1]  # Select outcome==1 from index
        .unstack(0)  # convert inner index to columns
)

所有产品:

       mean  sum
time1   0.0  0.0
time2   0.5  1.0
time3   0.5  1.0

【讨论】:

    猜你喜欢
    • 2019-08-11
    • 2020-08-04
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多