转置或融化以按列分组?

Transpose or melt to group by columns?

我有这个数据框:

df = pd.DataFrame({ "cluster" : ["A", "A", "A", "A", "A", "C", "C", "C", "C"], 
                    "col1": ["0", "0", "1", "1", "0", "1", "0", "1", "0"], 
                    "col2": ["1", "1", "1", "1", "0", "1", "1", "1", "0"] })

我想不出用这种格式得到数据框结果的最佳方法

col cluster avg
col1 A 0.4
col1 C 0.5
col2 A 0.8
col2 C 0.75

我试过使用转置,然后融化集群,但没有成功。任何帮助将不胜感激!

我想要的结果是 table - 其中所有列(集群除外)都是行,集群是融化的,并且计算每个集群的列值的平均值

看起来 meltgroupby + mean 的组合就可以了。请注意,“col”值是您输入的字符串,因此我们还必须先将它们转换为整数,然后再计算平均值:

out = (df.melt(['cluster'], var_name='col')
       .assign(value=lambda x: x['value'].astype(int))
       .groupby(['col', 'cluster'], as_index=False).mean())

输出:

    col cluster  value
0  col1       A   0.40
1  col1       C   0.50
2  col2       A   0.80
3  col2       C   0.75

您可以按 cluster 列分组并计算每组的平均值,然后 melt

df[['col1', 'col2']] = df[['col1', 'col2']].astype(int)

out = (df.groupby('cluster')
         .agg('mean').reset_index()
         .melt(id_vars=['cluster'], var_name='col', value_name='avg')
)
print(out)

  cluster   col   avg
0       A  col1  0.40
1       C  col1  0.50
2       A  col2  0.80
3       C  col2  0.75