मूल्यों को सेट करने के लिए iloc का उपयोग करना [बंद]


13

इस लाइन dataframe में पहले 4 पंक्तियों रिटर्न combinedके लिएfeature_a

combined.iloc[0:4]["feature_a"]

जैसा कि अपेक्षित था, यह अगली पंक्ति कॉलम के लिए डेटाफ्रेम में 2, 4 और 16 वीं पंक्तियों को लौटाती है feature_a:

combined.iloc[[1,3,15]]["feature_a"]

यह पंक्ति पहले 4 पंक्तियों को डेटाफ्रेम में सेट करती feature_aहै 77

combined.iloc[0:4]["feature_a"] = 77

यह लाइन कुछ करती है। कुछ प्रकार की संगणना तब से हो रही है जब इसे लंबी सूची में लागू करने में अधिक समय लगता है।

combined.iloc[[1,3,15]]["feature_a"] = 88

2, 4, और 16 वीं पंक्तियों को इसके साथ जाँचने पर सेट नहीं किया जाता है 88:

combined.iloc[[1,3,15]]["feature_a"]

बड़े पैमाने पर कोडिंग चक्कर लगाने के बिना मैं किसी डेटाफ़्रेम के स्तंभ की पंक्तियों की मनमानी सूची को किसी मूल्य पर कैसे सेट कर सकता हूं?

यह परिदृश्य ऐसा लगता है जैसे यह बहुत सीधा और सामान्य होना चाहिए।


यह केवल प्रोग्रामिंग के बारे में एक सवाल है (कोई आँकड़े नहीं) और इस तरह स्टैक ओवरफ्लो
जेक वेस्टफॉल

एक न्यूनतम प्रजनन योग्य उदाहरण के बिना इस तरह का प्रश्न
स्टैकओवरफ्लो

जवाबों:


24

यदि आप चयनकर्ताओं को उल्टा करते हैं, और पहले कॉलम से चयन करते हैं, तो यह ठीक काम करेगा:

कोड:

df.feature_a.iloc[[1, 3, 15]] = 88

क्यों?

जब आपने पहला (गैर-काम करने वाला तरीका) किया तो आप डेटा फ्रेम के एक गैर-सन्निहित अनुभाग का चयन कर रहे हैं। आपको चेतावनी प्राप्त करनी चाहिए:

एक मान DataFrame से एक स्लाइस की एक प्रति पर सेट करने की कोशिश कर रहा है। इसके बजाय .loc [row_indexer, col_indexer] = मान का उपयोग करने का प्रयास करें

दस्तावेज़ में कैवियट देखें: http://pandas.pydata.org/pandas- > डॉक्स / स्थिर / indexing.html # indexing-view-vs-copy

ऐसा इसलिए है क्योंकि दो स्वतंत्र ऑपरेशन हो रहे हैं।

  1. combined.iloc[[1,3,15]]केवल तीन पंक्तियों का एक नया डेटाफ़्रेम बनाता है, और फ़्रेम आवश्यक रूप से कॉपी किया जाता है। फिर...
  2. के माध्यम से एक कॉलम का चयन करें, ["feature_a"]लेकिन यह कॉपी के खिलाफ चुना गया है।

तो असाइनमेंट कॉपी में चला जाता है। इसे ठीक करने के विभिन्न तरीके हैं, लेकिन इस मामले में, पहले कॉलम का चयन करना आसान (और सस्ता) है, फिर असाइनमेंट के लिए कॉलम के कुछ हिस्सों का चयन करें।

टेस्ट कोड:

df = pd.DataFrame(np.zeros((20, 3)), columns=['feature_a', 'b', 'c'])
df.feature_a.iloc[[1, 3, 15]] = 88
print(df)

परिणाम:

    feature_a    b    c
0         0.0  0.0  0.0
1        88.0  0.0  0.0
2         0.0  0.0  0.0
3        88.0  0.0  0.0
4         0.0  0.0  0.0
5         0.0  0.0  0.0
6         0.0  0.0  0.0
7         0.0  0.0  0.0
8         0.0  0.0  0.0
9         0.0  0.0  0.0
10        0.0  0.0  0.0
11        0.0  0.0  0.0
12        0.0  0.0  0.0
13        0.0  0.0  0.0
14        0.0  0.0  0.0
15       88.0  0.0  0.0
16        0.0  0.0  0.0
17        0.0  0.0  0.0
18        0.0  0.0  0.0
19        0.0  0.0  0.0

1
यह काम कर सकता है, लेकिन क्यों?
मैथ्यू ड्र्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.