Dalam kasus seperti itu, saya memiliki DataFrame seperti

col1  col2
   a     1
   a     2
   a     3
   b     1
   b     2

Yang saya inginkan adalah grup pertama dengan col1 dan kemudian jumlahkan col2 kolom grup, akhirnya tambahkan sum ke DataFrame dan dapatkan

col1  col2  sum
   a     1    6
   a     2    6
   a     3    6
   b     1    3
   b     2    3
1
danche 18 Agustus 2017, 10:41

2 jawaban

Jawaban Terbaik

Opsi 1
transform mengembalikan hasil dengan indeks yang sama dari objek aslinya.
Saya menggunakan assign untuk mengembalikan salinan kerangka data dengan kolom baru.
Lihat dokumentasi split-apply-combine untuk informasi lebih lanjut.

df.assign(Sum=df.groupby('col1').col2.transform('sum'))

  col1  col2  Sum
0    a     1    6
1    a     2    6
2    a     3    6
3    b     1    3
4    b     2    3

Opsi 2
Gunakan join pada hasil normal groupby dan sum.

df.join(df.groupby('col1').col2.sum().rename('Sum'), on='col1')

  col1  col2  Sum
0    a     1    6
1    a     2    6
2    a     3    6
3    b     1    3
4    b     2    3

Opsi 3
Pendekatan kreatif dengan pd.factorize< /strong> dan np.bincount

f, u = df.col1.factorize()
df.assign(Sum=np.bincount(f, df.col2).astype(df.col2.dtype)[f])

  col1  col2  Sum
0    a     1    6
1    a     2    6
2    a     3    6
3    b     1    3
4    b     2    3
2
piRSquared 18 Agustus 2017, 08:00

Gunakan transform:

df['sum'] = df.groupby('col1')['col2'].transform('sum')
print (df)
  col1  col2  sum
0    a     1    6
1    a     2    6
2    a     3    6
3    b     1    3
4    b     2    3

Atau map secara agregat sum:

df['sum'] = df['col1'].map(df.groupby('col1')['col2'].sum())
print (df)
  col1  col2  sum
0    a     1    6
1    a     2    6
2    a     3    6
3    b     1    3
4    b     2    3
2
jezrael 18 Agustus 2017, 07:51