मेरे पास id, event और metric कॉलम वाला डेटासेट है:

df = pd.DataFrame([['a','x', 1], 
                  ['a','x',2],  
                  ['b','y',3],  
                  ['a','z',4],  
                  ['a','j',5]], columns = ['id','event','metric'])

   id event metric
0   a   x   1
1   a   x   2
2   b   y   3
3   a   z   4
4   a   j   5

sum, mean, std, min, max को प्राप्त करने के लिए मुझे इसे id और event के आधार पर समूहबद्ध करना होगा। metric जिसमें किसी दिए गए "id-event" समूह के लिए न केवल मान शामिल होंगे, बल्कि दिए गए id के लिए सभी पिछले ईवेंट के लिए भी metric मान शामिल होंगे। दूसरे शब्दों में, मुझे दी गई पंक्ति तक सभी पंक्तियों के लिए एकत्रीकरण की आवश्यकता है।

वांछित आउटपुट:

   id event sum mean        std       min   max
0   a   j   12  3.000000    1.825742    1   5
1   a   x   3   1.500000    0.707107    1   2
2   a   z   7   2.333333    1.527525    1   4
3   b   y   3   3.000000    NaN         3   3

मैंने फॉर-लूप दृष्टिकोण की कोशिश की, जब मैंने प्रत्येक समूह के लिए अपना डेटाफ्रेम फ़िल्टर किया। लेकिन समस्या यह है कि मेरे पास लगभग 20M पंक्तियाँ हैं, इसलिए गणना करने में हमेशा के लिए लग गया। मैं इसे बिना लूप के हल करने का प्रयास कर रहा हूं।

1
Klimentij Bulygin 16 नवम्बर 2019, 06:42

2 जवाब

सबसे बढ़िया उत्तर

आपको sort_values को id पर quicksort विकल्प के साथ id को सॉर्ट करने की आवश्यकता है, लेकिन अन्य कॉलम पर मूल क्रम रखें। इसके बाद, groupby को id पर और expanding को sum, mean, std, min, max पर। अंत में, pd.concat अंतिम df में event कॉलम जोड़ने के लिए। drop_duplicates प्रत्येक समूह की केवल अंतिम पंक्ति रखने के लिए id-event, और sort_values वांछित आदेश प्राप्त करने के लिए।

df1 = df.sort_values('id', kind='quicksort')
df2 = df1.groupby('id').expanding().metric.agg(['sum', 'mean', 'std', 'min', 'max']).droplevel(1)
df_final = (pd.concat([df1.set_index('id').event, df2], axis=1).reset_index().
              drop_duplicates(subset=['id', 'event'], keep='last').
              sort_values(['id', 'event']))

Out[96]:
  id event   sum      mean       std  min  max
3  a     j  12.0  3.000000  1.825742  1.0  5.0
1  a     x   3.0  1.500000  0.707107  1.0  2.0
2  a     z   7.0  2.333333  1.527525  1.0  4.0
4  b     y   3.0  3.000000       NaN  3.0  3.0
0
Andy L. 16 नवम्बर 2019, 22:32

आपको groupby का उपयोग करने की आवश्यकता है।

df.groupby(["id", "event"])["metric"].describe()
1
Florian Bernard 16 नवम्बर 2019, 06:46