Saya memiliki tiga kerangka data. Bagaimana cara menghitung total (jumlah) per kind untuk semua kolom. Dan kemudian memiliki nomor column menjadi 'total'


ONE={'kind':['clear','clean','light','dark','sweet'],
       'Age':[20, 21, 19, 18, 19],
   'number':['one','one','one','one','one']}

TWO={'kind':['clear','clean','light', 'sweet', 'middle'],
       'Age':[22, 1, 12, 18,40],
   'number':['two','two','two','two','two']}
THREE={'kind':['light','dark','sweet','clean','clear'],
       'Age':[20, 21, 19, 18, 100],
   'number':['three','three','three','three','three']}
ONE= pd.DataFrame(ONE)
TWO= pd.DataFrame(TWO)
THREE = pd.DataFrame(THREE)
mydf = ONE.append(TWO).append(THREE)

Keluaran menjadi seperti

kind    Age      number
clear   sum(Age) total
clean   sum(Age) total
light   sum(Age) total
dark    sum(Age) total
sweet   sum(Age) total

.....sama seperti mydf

1
Priit Mets 10 Mei 2021, 17:52

2 jawaban

Jawaban Terbaik

Jika Anda ingin kolom number mendapatkan 'total' dalam hal nilai numerik one, two, three, Anda dapat melakukannya dengan cara ini:

mydf.assign(number=mydf['number'].map({'one': 1, 'two': 2, 'three': 3})).groupby('kind', as_index=False).sum()

Hasil:

     kind  Age  number
0   clean   40       6
1   clear  142       6
2    dark   39       4
3   light   51       6
4  middle   40       2
5   sweet   56       6

Di sini, one, two, three diperlakukan sebagai 1, 2, 3.

Kami menggunakan .map() untuk memetakan string ke nilai numerik sebelum menjumlahkannya.

2
SeaBean 12 Mei 2021, 21:39

Gunakan metode groupby():

result=mydf.groupby('kind').agg(Age =('Age','sum'),number=('number','count'))

Sekarang Jika Anda mencetak result Anda akan mendapatkan hasil yang Anda inginkan:

       Age  number
kind        
clean   40      3
clear   142     3
dark    39      2
light   51      3
middle  40      1
sweet   56      3

Memperbarui:

Cara alternatif:

result=mydf.groupby('kind').agg({'Age':'sum','number':'count'})

Jika perlu gunakan metode reset_index():

result=result.reset_index()
2
Anurag Dabas 12 Mei 2021, 13:26