मैं एक शब्दकोश बनाना चाहता हूं जिसमें पांडा डेटा फ्रेम के सुविधाजनक फ़िल्टरिंग के लिए लैम्ब्डा फ़ंक्शन शामिल हैं। जब मैं प्रत्येक डिक्शनरी आइटम लाइन को लाइन से इंस्टेंट करता हूं, तो मुझे वह व्यवहार मिलता है जो मैं चाहता हूं। लेकिन जब मैं लूप के लिए उपयोग करता हूं, तो फ़िल्टर n के अंतिम मान का उपयोग करते हैं। क्या लैम्ब्डा फ़ंक्शन वैश्विक चर n का संदर्भ देता है, न कि तात्कालिकता के समय इसका मान? क्या लैम्ब्डा कार्यों की मेरी समझ बंद है?

ध्यान दें, इस उदाहरण को पानी पिलाया गया है। मेरे वास्तविक प्रोजेक्ट में, मैं डेटटाइम इंडेक्स का उपयोग करता हूं, और डिक्शनरी में पूर्णांक कुंजियां होंगी जो वर्ष के अनुसार फ़िल्टर करती हैं, उदाहरण के लिए। df.index.year == 2020, और कुछ स्ट्रिंग कुंजियाँ जो सप्ताह/सप्ताहांत, दिन के समय आदि के अनुसार फ़िल्टर होती हैं।

import pandas as pd

data = [[1,2],[3,4],[5,6]] # example df

df = pd.DataFrame(index=range(len(data)), data=data)

filts = {}
filts[1] = lambda df: df[df.index == 1]  # making a filter dictionary
filts[2] = lambda df: df[df.index == 2] # of lamda funcs

print(filts[1](df)) # works as expected
print(filts[2](df))

filts = {}
for n in range(len(data)):
    filts[n] = lambda df: df[df.index == n] # also tried wrapping n in int
# n = 0  # changes behaviour
print(filts[0](df))  # print out the results for n = 2
print(filts[1](df))  # same problem as above

# futher investigating lambdas
filts = {}
n = 0
filts[n] = lambda df: df[df.index == n]  # making a filter dictionary
n = 1
filts[n] = lambda df: df[df.index == n] # of lamda funcs
print(filts[0](df))  # print out the results for n = 1

0
likethevegetable 10 अक्टूबर 2020, 16:41

1 उत्तर

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

मैं प्रश्न के डुप्लिकेट-नेस के बारे में निश्चित नहीं हूं, और मैं इसका उत्तर दे रहा हूं क्योंकि मैंने स्वयं पांडा का उपयोग करके इसमें भाग लिया है। आप क्लोजर का उपयोग करके अपनी समस्या का समाधान कर सकते हैं।

अपना लूप इस प्रकार बदलें:

for n in range(len(data)):
    filts[n] = (lambda n: lambda df: df[df.index == n])(n)

ओपी के दृष्टिकोण में क्या गलत है?

लैम्ब्डा चर के संदर्भ को बनाए रखता है। तो n यहां वेरिएबल का संदर्भ है जिसे लूप में पुनरावृत्त किया जा रहा है। जब आप अपने लैम्ब्डा का मूल्यांकन करते हैं, तो n का संदर्भ (आपके filts में सभी परिभाषित लैम्ब्डा में संदर्भ n को निर्दिष्ट अंतिम मान को असाइन किया जाता है। लूप। इसलिए, जो आप देख रहे हैं वह अपेक्षित है। टेकअवे- "लैम्ब्डा का क्लोजर इस्तेमाल किए जा रहे वेरिएबल का संदर्भ रखता है, न कि इसके मान, इसलिए यदि वेरिएबल का मान बाद में बदलता है, तो मान क्लोजर भी बदल जाता है।" source

1
DaveIdito 10 अक्टूबर 2020, 13:53