我正在尝试为包含数百列的非常大的数据框生成汇总统计信息,并总结它们与感兴趣的“结果”的关系。可以使用下面的代码生成一个简化的数据框:
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
理想情况下,我想对数据框中的数百列执行此操作,并评估它们与结果的关系。
那么有人可以指导我找到一个解决方案,允许我对数百列执行此操作(无需单独键入它们的名称就是解决方案),并在干净的数据框中得到结果,如上面的示例输出所示?非常感谢!
最佳答案
正如@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
之前过滤然后stack
和 droplevel
:
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
关于pandas - groupby pandas 在特定条件下求均值和总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68810555/