2016-07-15 6 views
2

私は600列(df1)のパンダのデータフレームを持っており、各列の値を6つのグループに合計したいとします。つまり、新しいデータフレームを作成したいdf2)は100列あり、各列は入力データフレームからの6列の合計です。たとえば、各行df2の最初の列は、df1の最初の6つの列の合計になります(行を別々にします)。パンダのデータフレーム内の列の集約

A G ... 
0 36 
1 25 
2 32 
3 29 
4 19 
5 24 
:私はDF2の最初の列になりたいでしょう

 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 ...  

:私は使用していますデータフレームもDF1のために、各列名の文字列値(ここでは1つだけの文字で表されている)

を持っています

各行は、その行の最初の6つの列の合計です。次の列は次の6つの列の合計であり、列名は各組6の最初の列の名前です。(最初の列名は最初の列名、2番目の列名は7番目の列名です。

適切な列を合計するために列インデックスを使用しようとしましたが、関連する名前の新しい列に合計を格納する方法を見つける際に問題が発生しています。

これらの列を作成し、列名をdfからdf2にプルーピングする方法はありますか?

答えて

2

することはできdf.columns //6sumによって作成されたグループの列(axis=1)によってgroupby

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 

EDIT:

あなたがrangeshapeからIndexは、(列の長さを取得)を作成し、それを使用することができますin 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

この解決策の問題は、列名が文字列(カテゴリの名前)であるため、私は床分割演算子を使用してグループを分離できないと考えています。私は私の投稿を編集して、これがより明確になるようにします。 – Nizag

+0

編集しました!私は現在、pd.Index関数だけでなく、データフレーム形状関数を調べて、このような仕組みがどのように機能するかをよりよく理解しています。本当にありがとう! – Nizag

+0

おめでとうございます。カテゴリ名に新しい列の名前を変更することもできます。 – jezrael

関連する問題