2016-07-15 390 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