2017-01-12 53 views
1

私はPandas DataFrameを持っています。Pandas DataFrameの列の合計

:私はそれを行う1つの方法を知っている

LeafId pidx pidy count 
    1  x  y  50 
    1  x  z  30 
    3  b  q  10 

:として

LeafId pidx pidy count 
    1  x  y  10 
    1  x  y  20 
    1  x  z  30 
    3  b  q  10 
    1  x  y  20 

私たちは、私がカウント欄を合計し、データフレームDF2を取得したいpidx = x and pidy = y

の複数の行があることがわかります

df2 = df.groupby(['pidx','pidy']).agg({'LeafID':'first',count':'sum'}).reset_index() 

しかし、私は巨大なDataFrameのための最も効率的な方法を望んでいますレコードのイオン)が必要であり、これは最小限の時間しかかかりません。

これを実行する方法はありますか?

また、LeafID.agg()に入れるのではなく、次の操作を行うことはできますか?

df2 = df.groupby(['LeafID','pidx','pidy']).agg({count':'sum'}).reset_index() 
+0

pidxとpidyで並べ替えて、いずれかが変更された範囲のインデックスを見つけ、その範囲で合計を適用します。 – rafaelvalle

答えて

2

必要がある場合はLeafIdによってgroupbypidxpidy列:

df1 = df.groupby(['LeafId','pidx','pidy'], as_index=False)['count'].sum() 
print (df1) 
    LeafId pidx pidy count 
0  1 x y  50 
1  1 x z  30 
2  3 b q  10 

私はいくつかのタイミングしてみてください:

np.random.seed(123) 
N = 1000000 

L1 = list('abcdefghijklmnopqrstu') 
L2 = list('efghijklmnopqrstuvwxyz') 
df = pd.DataFrame({'LeafId':np.random.randint(1000, size=N), 
        'pidx': np.random.choice(L1, N), 
        'pidy': np.random.choice(L2, N), 
        'count':np.random.randint(1000, size=N)}) 
#print (df) 

print (df.groupby(['LeafId','pidx','pidy'], as_index=False)['count'].sum()) 
print (df.groupby(['LeafId','pidx','pidy']).agg({'count':'sum'}).reset_index()) 

In [261]: %timeit (df.groupby(['LeafId','pidx','pidy'], as_index=False)['count'].sum()) 
1 loop, best of 3: 544 ms per loop 

In [262]: %timeit (df.groupby(['LeafId','pidx','pidy']).agg({'count':'sum'}).reset_index()) 
1 loop, best of 3: 466 ms per loop 

小さなグループを10000から1000

np.random.seed(123) 
N = 1000000 

L1 = list('abcdefghijklmnopqrstu') 
L2 = list('efghijklmnopqrstuvwxyz') 
df = pd.DataFrame({'LeafId':np.random.randint(10000, size=N), 
        'pidx': np.random.choice(L1, N), 
        'pidy': np.random.choice(L2, N), 
        'count':np.random.randint(10000, size=N)}) 
print (df) 

print (df.groupby(['LeafId','pidx','pidy'], as_index=False)['count'].sum()) 
print (df.groupby(['LeafId','pidx','pidy']).agg({'count':'sum'}).reset_index()) 

In [264]: %timeit (df.groupby(['LeafId','pidx','pidy'], as_index=False)['count'].sum()) 
1 loop, best of 3: 933 ms per loop 

In [265]: %timeit (df.groupby(['LeafId','pidx','pidy']).agg({'count':'sum'}).reset_index()) 
1 loop, best of 3: 775 ms per loop 
+0

2つの質問があります。私の方法は.aggになります。もしそうなら、あなたの答えは.aggよりも速くなりますか? – Shubham

+0

@SRingne試してみてください。 DFは巨大だと言って以来。タイミングを教えてください。 – MYGz

+1

@jezrael '.sum()'と明示的な 'column.sum()'は1列しかないのでここで違いがありますか? – MYGz