对Pandas Dataframe中的列进行求和

时间:2016-07-15 20:00:57

标签: python pandas dataframe sum

我有一个包含600列(df1)的pandas数据帧,我想将每列的值加总为6个。换句话说,我想创建一个包含100列的新数据帧(df2)列是输入数据帧中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中第一列的名称。(第一列名称是第一列' s,第二列名字是第七栏等等。)

我已经尝试使用列索引来汇总正确的列,但是我在找到一种方法将这些总和存储在具有相关名称的新列中时遇到了问题。

是否有pythonic方法来创建这些列,并将列名从df拉入df2?

1 个答案:

答案 0 :(得分:3)

您可以groupbyaxis=1sum创建的论坛的列df.columns //6 {<3}}:

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

编辑:

您可以从Indexshape创建range(获取列长)并在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