मैं पंडों (18000000 से अधिक पंक्तियों, 8 स्तंभों) में एक बड़े डेटासेट के साथ काम करता हूं और कुछ पंक्तियों में से एक कॉलम को सही पर असाइन करना चाहता हूं। मैं पदानुक्रमित अनुक्रमण का उपयोग करता हूं और मेरा डेटाफ्रेम निम्नानुसार संरचित है:

                    col1       col2       ...     col8     
name    position                              
"name2"   1        False     -0.827317           0.569605
          2        False     -0.273178           0.997953
          3        False     -0.827317           0.569605
         ...        ...        ...        ...      ...
         15000     False     -0.827317           0.569605
         15001     False     -0.001015           0.569605
"name2"   1        False     -0.827317           0.827317
          2        False     -0.827317           0.569605
          3        False     -0.827317           0.001015
         ...        ...        ...        ...      ...
         15000     False     -0.827317           0.569605
         15001     False     -0.998997           0.569605
"name3"   1        False     -0.827317           0.569605
          2        False     -0.827317           0.000000
          3        False     -0.827317           0.569605
         ...        ...        ...        ...      ...
         15000     False     -0.998997           0.569605
         15001     False     -0.827317           0.998997

...      ...        ...        ...        ...      ... 

मैं col1 से सत्य में पिछली गणनाओं के आधार पर कुछ पदों को असाइन करना चाहता हूं। मैं इसे अपने "नाम" इंडेक्स में सभी इंडेक्स के लिए करना चाहता हूं।

तो सबसे पहले मैंने इस टपल इंडेक्स का उपयोग करके सही पंक्तियों का चयन करने का प्रयास किया।

df.loc[(all_names, positions), 'col1'] = True

इसने काम किया, लेकिन यह अविश्वसनीय रूप से धीमा था, जिसने इसे व्यवहार में अनुपयोगी बना दिया। मैंने इसे ज्यूपिटर नोटबुक में समय देने की कोशिश की, लेकिन जब मैंने %%timeit का उपयोग किया तो iPython कर्नेल क्रैश हो गया।

तो फिर मैंने इस कोड का उपयोग करने की कोशिश की:

for name in all_names: 
    df.loc[name].loc[positions, 'col1'] = True 

मेरे आश्चर्य के लिए यह कम से कम एक कारक ~ 10 तेज था। मुझे पता है कि df.loc[].loc[] = True का उपयोग करना A value is trying to be set on a copy of a slice from a DataFrame. के कारण इसे हल करने का एक उचित तरीका नहीं है, लेकिन यह वास्तव में काम करता है जैसा मैं चाहता हूं, और सभी सही मान सेट हैं। लेकिन यह अभी भी धीमा है (संपूर्ण डेटासेट के लिए लगभग 1 मिनट)

मैंने सोचा था कि निश्चित रूप से सभी नामों पर पुनरावृत्ति करना सबसे तेज़ तरीका नहीं हो सकता है, इसलिए मैंने स्लाइसर का उपयोग करने का प्रयास किया

df.loc[(slice(None), positions), 'col1'] = True

लेकिन इसने मेरे पहले प्रयास के समान प्रदर्शन किया।

पदानुक्रमित अनुक्रमण का उपयोग करके कुछ मानों को चुनने और असाइन करने का सबसे अच्छा और तेज़ तरीका क्या है? जब पहले स्तर पर सभी इंडेक्स का उपयोग करना चाहते हैं और फिर केवल कुछ दूसरे स्तर पर।

3
cjerik 22 अगस्त 2019, 16:26

1 उत्तर

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

चूंकि मल्टीइंडेक्स के प्रत्येक name भाग का चयन किया जा रहा है, शायद get_level_values(1) द्वारा अनुक्रमणित करने का प्रयास किया जा रहा है, जहां (1) position इंगित करता है:

df.loc[df.index.get_level_values(1).isin(positions), 'col1'] = True

कोशिश करें और देखें कि क्या यह कोई गति प्रदान करता है।

3
Ted 22 अगस्त 2019, 14:12