मुझे नहीं पता कि मैं अपने प्रश्न का वर्णन कैसे करूं, इसलिए मैं यहां केवल एक उदाहरण दिखाऊंगा।

A B
1 3
1 4
2 5
2 8
2 6
3 6
3 8
4 10
4 1

डेटा फ्रेम में दो कॉलम ए और बी हैं। मैं इसे इस तरह की एक सूची वापस करना चाहता हूं।

[[3,4],[5,8,6],[6,8],[10,1]]

जैसा कि आप देखते हैं, इसे A द्वारा समूहीकृत किया जाता है और B कॉलम में संख्याओं की एक सूची देता है। ध्यान देने योग्य बात यह है कि B में तत्वों का क्रम नहीं बदलता है। साथ ही उप-सूचियों का क्रम वही है जो कॉलम ए में दिखाया गया है। ([3,4] समूह 1 से, [5,8,6] समूह 2 से, आदि)

मान लीजिए कि डेटाफ्रेम पहले से ही ए द्वारा ऑर्डर किया गया है। मुझे पता है कि इसे करने के लिए लूप के लिए कैसे उपयोग करना है, लेकिन मेरे डेटासेट में 1 बिलियन रिकॉर्ड हैं। तो मैं इस समस्या के लिए कुछ कुशल और साफ कोड ढूंढ रहा हूं।

2
Eleanor 30 मार्च 2018, 00:11

1 उत्तर

बड़े डेटासेट के लिए मैं Numpy का उपयोग करने की सलाह देता हूं क्योंकि यह तेज़ है।

मैं यह भी अनुशंसा करता हूं कि सॉर्ट करने के लिए फॉर-लूप का उपयोग नहीं करें, df.sort_values() बहुत तेज़ है।

यहां मेरे द्वारा काम किए गए 15 मिलियन पंक्ति डेटासेट की तुलना है।

Numpy के माध्यम से

import numpy as np
df = df[['a','b']]
    
keys, values = df.sort_values('a').values.T
ukeys, index = np.unique(keys, True)
arrays = np.split(values, index[1:])
df = pd.DataFrame({'a':ukeys,'b':[list(a) for a in arrays]})
NUMPY
Total time: 102.379 s for 15,397,309 rows
Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     3         1    1205208.0 1205208.0      1.2    
     4         1   60671365.0 60671365.0     59.3   
     5         1   16897187.0 16897187.0     16.5    
     6         1    1430774.0 1430774.0      1.4     
     7         1   22174794.0 22174794.0     21.7     
     8         1          4.0      4.0      0.0      

पंडों के 'ग्रुपबी' के साथ

df.groupby('a')['b'].apply(list)
PANDAS GROUPBY
Total time: 146.23 s for 15,397,309 rows

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     3         1    1181714.0 1181714.0      0.8     
     4         1  145048477.0 145048477.0     99.2      
     5         1          3.0      3.0      0.0      
1
Community 20 जून 2020, 09:12