2016-07-15 267 views
2

我有600列(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中第一列的名称。(第一列名称是第一列,第二列名称是第七列列的,等等)

我使用列索引来概括正确的列试过,但我有找到一个方法来存储与相关名称的新列的款项的问题。

有用来创建这些列,并从DF拉列名到DF2一个Python的方式?

回答

2

您可以groupby通过与df.columns //6sum创建的组列(axis=1):

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 

编辑:

您可以创建Indexrangeshape(得到列的长度),并用它在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 
+0

这个解决方案的问题在于列名称是字符串(类别名称),所以我不认为我可以使用floor division运算符来分隔这些组。我将编辑我的文章,以便更清楚。 – Nizag

+0

您的编辑做到了!我现在正在研究pd.Index函数以及dataframe shape函数,以更好地理解这些东西的工作原理。非常感谢! – Nizag

+0

很高兴能为您提供帮助。我也添加重命名新的列到类别名称。 – jezrael