समूह डेटाफ़्रेम और योग और गणना प्राप्त करें?


82

मेरे पास एक डेटाफ्रेम है जो इस तरह दिखता है:

              Company Name              Organisation Name  Amount
10118  Vifor Pharma UK Ltd  Welsh Assoc for Gastro & Endo 2700.00
10119  Vifor Pharma UK Ltd    Welsh IBD Specialist Group,  169.00
10120  Vifor Pharma UK Ltd             West Midlands AHSN 1200.00
10121  Vifor Pharma UK Ltd           Whittington Hospital   63.00
10122  Vifor Pharma UK Ltd                 Ysbyty Gwynedd   75.93

इस तरह दिखने वाली एक नई डेटाफ्रेम प्राप्त करने के लिए मैं कैसे योग Amountऔर गणना कर सकता हूं Organisation Name?

              Company Name             Organisation Count   Amount
10118  Vifor Pharma UK Ltd                              5 11000.00

मुझे पता है कि योग या गणना कैसे करें :

df.groupby('Company Name').sum()
df.groupby('Company Name').count()

लेकिन दोनों कैसे नहीं!

जवाबों:


147

इसे इस्तेमाल करे:

In [110]: (df.groupby('Company Name')
   .....:    .agg({'Organisation Name':'count', 'Amount': 'sum'})
   .....:    .reset_index()
   .....:    .rename(columns={'Organisation Name':'Organisation Count'})
   .....: )
Out[110]:
          Company Name   Amount  Organisation Count
0  Vifor Pharma UK Ltd  4207.93                   5

या यदि आप अनुक्रमणिका रीसेट नहीं करना चाहते हैं:

df.groupby('Company Name')['Amount'].agg(['sum','count'])

या

df.groupby('Company Name').agg({'Amount': ['sum','count']})

डेमो:

In [98]: df.groupby('Company Name')['Amount'].agg(['sum','count'])
Out[98]:
                         sum  count
Company Name
Vifor Pharma UK Ltd  4207.93      5

In [99]: df.groupby('Company Name').agg({'Amount': ['sum','count']})
Out[99]:
                      Amount
                         sum count
Company Name
Vifor Pharma UK Ltd  4207.93     5

2
@MaxU अलग-अलग लेकिन कई युग्मों के योग और गणना को लागू करने का एक तरीका है। जब मैं स्तंभों को इस तरह सूची में देने की कोशिश करता हूं: agg ({['hotel_name', 'hotel_country']: 'count', ['cost', 'revenue', 'click']: 'sum'}) "टाइपError: अस्वाभाविक प्रकार: 'सूची'" त्रुटि
CanCeylan

@CanCeylan नहीं जानते कि यदि संभव हो तो इसे एक ग्रुपबी क्लॉज में करें लेकिन आप डेटाफ्रेम में एक डमी काउंट-कॉलम जोड़कर इसे हासिल कर सकते हैं तो ग्रुपबी योग करें:df['count'] = 1
कार्ल अनका

1
अंत में, यह करने के लिए खोज करने के 2 घंटे ... केवल 3 विकल्प: df.groupby ('कंपनी का नाम')। agg ({'राशि': ['राशि', 'गिनती']}) मेरे लिए काम किया। ।
चार

हाय उस महान समाधान के लिए धन्यवाद। मेरे विशेष मामले में मैं राशि प्राप्त करने और पंक्तियों की संख्या की गणना करने के लिए दो अलग-अलग स्तंभों पर आपके समाधान का उपयोग कर रहा हूं। Unfortunenatly मुझे पंक्तियों की संख्या दो बार मिलती है (inc। क्योंकि यह दोनों स्तंभों के लिए मायने रखता है)। क्या कोई तरीका है कि एक .counts को हटाया जाए ताकि मेरी टेबल साफ दिखे? df.groupby(df['L2 Name'])[["Amount arrear","VSU"]].agg(['sum','count'])
MLAlex

नमस्कार, आपके शानदार उत्तर के लिए धन्यवाद। क्या आप जानते हैं कि जो नए कॉलम बनाए गए हैं उनकी व्याख्या कैसे करें और इसे अधिक परंपरागत तरीके से कैसे सपाट करें?
सोलल

20

बस अगर आप सोच रहे थे कि एकत्रीकरण के दौरान कॉलम का नाम कैसे बदला जाए, तो यहाँ बताया गया है कि कैसे

पांडा> = 0.25: नामित एकत्रीकरण

df.groupby('Company Name')['Amount'].agg(MySum='sum', MyCount='count')

या,

df.groupby('Company Name').agg(MySum=('Amount', 'sum'), MyCount=('Amount', 'count'))

                       MySum  MyCount
Company Name                       
Vifor Pharma UK Ltd  4207.93        5

यह अपवादित उत्तर होना चाहिए, क्या पुराने प्रश्नों / उत्तरों को चीजों को करने के नए बेहतर तरीके से अपडेट करने का कोई तरीका है? अपवादित उत्तर गलत नहीं है, बस अब सबसे अच्छा तरीका नहीं है।
JSharm

@JSharm स्पष्ट रूप से आप ओपी के दिमाग को नहीं बदल सकते हैं लेकिन आप उन पोस्टों को निश्चित रूप से उभार सकते हैं जिन्हें आप शीर्ष पर होना चाहते हैं। यदि आप पर्याप्त लोगों को सोचते हैं और उसी तरह कार्य करते हैं, तो हम किसी दिन वहां पहुंचेंगे;) पीएस स्वीकार किए गए उत्तर पर छाया नहीं फेंकेंगे, मुझे अभी भी लगता है कि यह इस सवाल का सबसे अच्छा जवाब है जब तक पांडा सिंटैक्स का समर्थन करना जारी रखता है, जिस पर मुझे पूरा भरोसा है वह अभी तक एक अच्छे के लिए है।
cs95

4

यदि आपके पास बहुत सारे कॉलम हैं और केवल एक ही अलग है जो आप कर सकते हैं:

In[1]: grouper = df.groupby('Company Name')
In[2]: res = grouper.count()
In[3]: res['Amount'] = grouper.Amount.sum()
In[4]: res
Out[4]:
                      Organisation Name   Amount
Company Name                                   
Vifor Pharma UK Ltd                  5  4207.93

ध्यान दें कि आप अपनी इच्छानुसार संगठन नाम कॉलम का नाम बदल सकते हैं।


1
df.groupby('Company Name').agg({'Organisation name':'count','Amount':'sum'})\
    .apply(lambda x: x.sort_values(['count','sum'], ascending=False))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.