在Pandas数据框中对列进行分组求和

3
我有一个包含600列的pandas数据框(df1),我想将每一列的值分组6个一组进行求和。换句话说,我想创建一个新的数据框(df2),它有100列,每一列都是输入数据框中6列的总和。例如,df2中第一列的每一行都是df1中前六列的总和(保持行分离)。我的数据框中还有每个列名的字符串值(这里只用单个字母表示)。
对于df1:
      A    B    C    D    E    F    G    H    I    J ...   
0     9    6    3    4    7    7    6    0    5    2 ...       
1     8    0    6    6    0    5    6    5    8    7 ...           
2     9    0    7    2    9    5    3    2    1    7 ...            
3     5    2    9    6    7    0    3    8    5    0 ...            
4     7    1    0    7    4    0    2    0    5    8 ...     
5     0    9    2    0    4    9    5    7    6    2 ...       

我希望df2的第一列为:

    A    G ... 
0   36  
1   25
2   32
3   29
4   19
5   24

每一行的值是该行前六列的总和。下一列将是接下来六列的总和,以此类推,每组6列的第一个列名为该组中第一列的名称。(第一列的名称是第一列的名称,第二列的名称是第七列的名称,以此类推。)
我尝试使用列索引来计算正确的列之和,但我无法找到一种方法来将这些总和存储在具有相关名称的新列中。
有没有一种Pythonic的方法来创建这些列,并从df中提取列名到df2中?
1个回答

4

您可以通过列 (axis=1) 进行 groupby,使用 df.columns //6 创建的组,并使用 sum 进行汇总:

print (df)
   0  1  2  3  4  5  6  7  8  9  10  11  12  13
0  9  6  3  4  7  7  6  0  5  2   2   3   7   2
1  8  0  6  6  0  5  6  5  8  7   9   5   5   1
2  9  0  7  2  9  5  3  2  1  7   5   9   6   6
3  5  2  9  6  7  0  3  8  5  0   8   8   9   9
4  7  1  0  7  4  0  2  0  5  8   2   4   4   1
5  0  9  2  0  4  9  5  7  6  2   7   1   5   3

#if values of columns are not int
#df.columns = df.columns.astype(int) 
print (df.columns // 6)
Int64Index([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2], dtype='int64')

print (df.groupby(df.columns // 6, axis=1).sum())
    0   1   2
0  36  18   9
1  25  40   6
2  32  27  12
3  29  32  18
4  19  21   5
5  24  28   8

编辑:

您可以通过从rangeshape(获取列长度)创建Index并在groupby中使用它:

idx = pd.Index(range(df.shape[1])) // 6
print (idx)
Int64Index([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2], dtype='int64')

df1 = df.groupby(idx, axis=1).sum()
#if need rename columns by categories
df1.columns = df.columns[::6]
print (df1)
    A   G   M
0  36  18   9
1  25  40   6
2  32  27  12
3  29  32  18
4  19  21   5
5  24  28   8

这个解决方案的问题在于列名是字符串(类别名称),因此我认为我不能使用地板除法运算符来分离组。我会编辑我的帖子,以便更清楚。 - Nizag
你的修改成功了!我现在正在研究pd.Index函数以及数据框形状函数,以更好地理解这些东西的工作原理。非常感谢! - Nizag
很高兴能帮助您。我还将重命名新列为类别名称。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接