【问题标题】:Summing Groups of Columns within a Pandas Dataframe对 Pandas 数据框中的列组求和
【发布时间】:2016-07-15 20:00:56
【问题描述】:

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

我尝试使用列索引对正确的列求和,但在寻找将总和存储在具有相关名称的新列中的方法时遇到问题。

有没有一种 Python 的方式来创建这些列,并将列名从 df 拉到 df2 中?

【问题讨论】:

    标签: python pandas dataframe sum


    【解决方案1】:

    您可以按列 (axis=1) groupbydf.columns //6sum 创建的组:

    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
    

    【讨论】:

    • 这个解决方案的问题是列名是字符串(类别名称),所以我认为我不能使用地板除法运算符来分隔组。我将编辑我的帖子,以便更清楚。
    • 您的编辑做到了!我现在正在研究 pd.Index 函数以及数据框形状函数,以更好地了解这些东西是如何工作的。非常感谢!
    • 很高兴能为您提供帮助。我还将重命名新列添加到类别名称。
    猜你喜欢
    • 2014-07-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    相关资源
    最近更新 更多