{"id":"l-pda-2-3","courseId":"python-data-analysis","lang":"ar","kind":"lesson","summary":"اختر الأعمدة بالأقواس المربعة، ثم اختر صفوفًا وأعمدة محدّدة بـ ‎.loc (بالتسمية) و ‎.iloc (بالموقع)، واعرف أيّهما تستخدم بعد الترتيب أو التصفية.","html":"<p>يسأل مدير المنتجات في Cartwheel: “بكم نبيع مطحنة القهوة، المنتج 7؟” و&quot;أرني أغلى خمسة منتجات مع تكاليفها&quot;. كلاهما مسألة اختيار: من جدول، استخرج هذه الصفوف وهذه الأعمدة بالضبط. تعطيك pandas أداتين دقيقتين لذلك، <code dir=\"ltr\">.loc</code> و<code dir=\"ltr\">.iloc</code>، ومعظم ارتباك المبتدئين يأتي من الخلط بينهما. القاعدة قصيرة: <code dir=\"ltr\">.loc</code> تستخدم <strong>التسميات</strong>، و<code dir=\"ltr\">.iloc</code> تستخدم <strong>المواقع</strong>.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">الأعمدة أولًا</h2>\n<p>الأقواس المربعة على DataFrame تختار الأعمدة:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"0\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">import</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pandas </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">as</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">products </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"products.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">index_col</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"product_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(products[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"name\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].head(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))                    </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># one column: a Series</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(products[[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"name\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"unit_price\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]].head(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))    </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># a list of columns: a DataFrame</span></span></code></pre><div class=\"run-output\" data-run-output=\"0\" hidden></div></div>\n<p>جعل <code dir=\"ltr\">index_col=&quot;product_id&quot;</code> معرّف المنتج فهرسًا للصفوف بدلًا من 0 و1 و2 الافتراضية. هذا الاختيار وحده يجعل كل ما يلي يُقرأ بطبيعية: المنتج 7 هو الصف المسمّى 7. ومع DataFrame محمّل مسبقًا، تقوم <code dir=\"ltr\">products.set_index(&quot;product_id&quot;)</code> بالشيء نفسه وتعيد DataFrame جديدًا.</p>\n<p>سترى أيضًا <code dir=\"ltr\">products.unit_price</code> في الدروس التعليمية. الوصول بالنقطة يعمل مع الأسماء البسيطة، لكنه يفشل مع الأسماء التي فيها مسافات، ويعيد بصمت شيئًا خاطئًا حين يتشارك عمود اسمه مع method في الـ DataFrame: عمود اسمه <code dir=\"ltr\">count</code> أو <code dir=\"ltr\">size</code> تحجبه الـ method التي تحمل الاسم نفسه. الأقواس المربعة تعمل دائمًا، فاجعلها خيارك الافتراضي.</p>\n<p>الأقواس المزدوجة ليست خطأً كتابيًا. الزوج الخارجي هو الاختيار، والزوج الداخلي قائمة Python بأسماء الأعمدة. عمود واحد داخل قائمة يعطيك DataFrame مع ذلك.</p>\n<h2 id=\"sec-2\" tabindex=\"-1\">‎.loc: الاختيار بالتسمية</h2>\n<p>تأخذ <code dir=\"ltr\">.loc[rows, columns]</code> تسميات الصفوف أولًا، ثم تسميات الأعمدة:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"1\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"1\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">import</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pandas </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">as</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">products </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"products.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">index_col</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"product_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(products.loc[</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">7</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"unit_price\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])                       </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># one value</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(products.loc[</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">7</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])                                     </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># one row, as a Series</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(products.loc[[</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">11</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">21</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">37</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">], [</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"name\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"unit_price\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]])  </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># chosen rows and columns</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(products.loc[</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">:</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"name\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">:</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"unit_price\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])              </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># label slices</span></span></code></pre><div class=\"run-output\" data-run-output=\"1\" hidden></div></div>\n<p>القوائم تختار التسميات التي تذكرها بالضبط، وبالترتيب نفسه. والشرائح تأخذ نطاقًا من التسميات، وهذا هو الجزء الذي يجب أن تتذكّره: <strong>شرائح <code dir=\"ltr\">.loc</code> تشمل التسمية الأخيرة</strong>. تعيد <code dir=\"ltr\">products.loc[1:3]</code> المنتجات 1 و2 و3. وشريحة الأعمدة <code dir=\"ltr\">&quot;name&quot;:&quot;unit_price&quot;</code> تشمل <code dir=\"ltr\">unit_price</code> بالمثل. يصبح هذا منطقيًا حين تفكّر بالتسميات: “من المنتج 1 إلى المنتج 3” تشمل المنتج 3.</p>\n<p>اطلب تسمية غير موجودة، مثل <code dir=\"ltr\">products.loc[99]</code>، فتحصل على <code dir=\"ltr\">KeyError: 99</code>. هذه ميزة: المعرّف الخاطئ يجب أن يفشل بصوت عالٍ، لا أن يعيد نتيجة فارغة قد تلصقها في تقرير. وحين يكون غياب التسمية احتمالًا طبيعيًا، افحص أولًا بـ <code dir=\"ltr\">99 in products.index</code>، التي تعيد <code dir=\"ltr\">True</code> أو <code dir=\"ltr\">False</code>.</p>\n<p>و<code dir=\"ltr\">.loc</code> أيضًا هي الأداة الوحيدة التي تستخدمها <strong>لإسناد</strong> القيم، كما سترى في الدرس 2.5: <code dir=\"ltr\">products.loc[7, &quot;unit_price&quot;] = 135.45</code> تغيّر خلية واحدة بالضبط.</p>\n<h2 id=\"sec-3\" tabindex=\"-1\">‎.iloc: الاختيار بالموقع</h2>\n<p>تتجاهل <code dir=\"ltr\">.iloc</code> التسميات وتعدّ المواقع من 0، وشرائحها تستبعد النهاية، تمامًا مثل قوائم Python:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"2\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"2\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">import</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pandas </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">as</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">products </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"products.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">index_col</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"product_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(products.iloc[</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])            </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># first row, whatever its label</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(products.iloc[:</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, :</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">2</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])       </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># first three rows, first two columns</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(products.iloc[</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">-</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">][</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"name\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])   </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># last row's name</span></span></code></pre><div class=\"run-output\" data-run-output=\"2\" hidden></div></div>\n<p>استخدم <code dir=\"ltr\">.iloc</code> حين يكون الموقع هو ما تقصده: “الخمسة الأولى”، “الصف الأخير”، “كل صف ثانٍ”. واستخدم <code dir=\"ltr\">.loc</code> حين تكون الهوية هي ما تقصده: “المنتج 7”، “العمود <code dir=\"ltr\">unit_price</code>”.</p>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 700 250\" role=\"img\" aria-labelledby=\"l-pda-2-3-t1\"><defs><marker id=\"arrow-l-pda-2-3-1\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\"><path d=\"M0 0 L10 5 L0 10 z\" class=\"d-arrowhead\"/></marker></defs>\n  <title id=\"l-pda-2-3-t1\">جدول مرتّب بحسب السعر، تسميات فهرسه 21 و 22 و 41 و 1 بهذا الترتيب، ومواقعه من 0 إلى 3. loc[1] تشير إلى الصف المسمّى 1، الواقع في الموقع 3. و iloc[0] تشير إلى الصف في الموقع 0، وتسميته 21.</title>\n  <text class=\"d-label-muted\" x=\"40\" y=\"30\" text-anchor=\"middle\">الموقع</text>\n  <text class=\"d-label-muted\" x=\"120\" y=\"30\" text-anchor=\"middle\">التسمية</text>\n  <text class=\"d-label-strong\" x=\"300\" y=\"30\" text-anchor=\"middle\">الاسم (مرتّب بالسعر)</text>\n  <rect class=\"d-box-accent\" x=\"80\" y=\"44\" width=\"400\" height=\"40\" rx=\"6\"/>\n  <text class=\"d-label\" x=\"40\" y=\"69\" text-anchor=\"middle\">0</text>\n  <text class=\"d-label-strong\" x=\"120\" y=\"69\" text-anchor=\"middle\">21</text>\n  <text class=\"d-label\" x=\"300\" y=\"69\" text-anchor=\"middle\">Standing Desk 140cm</text>\n  <rect class=\"d-box\" x=\"80\" y=\"92\" width=\"400\" height=\"40\" rx=\"6\"/>\n  <text class=\"d-label\" x=\"40\" y=\"117\" text-anchor=\"middle\">1</text>\n  <text class=\"d-label-strong\" x=\"120\" y=\"117\" text-anchor=\"middle\">22</text>\n  <text class=\"d-label\" x=\"300\" y=\"117\" text-anchor=\"middle\">Ergonomic Task Chair</text>\n  <rect class=\"d-box\" x=\"80\" y=\"140\" width=\"400\" height=\"40\" rx=\"6\"/>\n  <text class=\"d-label\" x=\"40\" y=\"165\" text-anchor=\"middle\">2</text>\n  <text class=\"d-label-strong\" x=\"120\" y=\"165\" text-anchor=\"middle\">41</text>\n  <text class=\"d-label\" x=\"300\" y=\"165\" text-anchor=\"middle\">Adjustable Dumbbells</text>\n  <rect class=\"d-box-primary\" x=\"80\" y=\"188\" width=\"400\" height=\"40\" rx=\"6\"/>\n  <text class=\"d-label\" x=\"40\" y=\"213\" text-anchor=\"middle\">...</text>\n  <text class=\"d-label-strong\" x=\"120\" y=\"213\" text-anchor=\"middle\">1</text>\n  <text class=\"d-label\" x=\"300\" y=\"213\" text-anchor=\"middle\">Cast Iron Skillet 26cm</text>\n  <text class=\"d-code\" x=\"560\" y=\"69\">.iloc[0]</text>\n  <path class=\"d-arrow\" d=\"M555 64 L490 64\" marker-end=\"url(#arrow-l-pda-2-3-1)\"/>\n  <text class=\"d-code\" x=\"560\" y=\"213\">.loc[1]</text>\n  <path class=\"d-arrow\" d=\"M555 208 L490 208\" marker-end=\"url(#arrow-l-pda-2-3-1)\"/>\n</svg><figcaption>‎.loc تجد الصفوف بالتسمية، و ‎.iloc بالموقع</figcaption></figure>\n<h2 id=\"sec-4\" tabindex=\"-1\">لماذا يهم الفرق: الترتيب</h2>\n<p>رتّب المنتجات بحسب السعر، فتفترق الأداتان:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"3\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"3\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">import</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pandas </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">as</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">products </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"products.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">index_col</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"product_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">by_price </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> products.sort_values(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"unit_price\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">ascending</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">False</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(by_price.iloc[:</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">][[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"name\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"unit_price\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]])   </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># the three priciest</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(by_price.loc[</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"name\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])                     </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># still the skillet</span></span></code></pre><div class=\"run-output\" data-run-output=\"3\" hidden></div></div>\n<p>الترتيب ينقل الصفوف، لكن كل صف يحتفظ بتسميته. أصبحت <code dir=\"ltr\">by_price.iloc[0]</code> الآن هي Standing Desk، أغلى منتج بسعر 449 دولارًا؛ بينما <code dir=\"ltr\">by_price.loc[1]</code> ما زالت Cast Iron Skillet، أينما انتهى بها المطاف. والتصفية تتصرّف بالطريقة نفسها: بعد أن تحتفظ ببعض الصفوف فقط، تصبح في التسميات فجوات (1، 4، 9…)، بينما يُعاد ترقيم المواقع 0، 1، 2. وإذا أردت تسميات جديدة من 0 إلى n، فإن <code dir=\"ltr\">reset_index(drop=True)</code> تعيدها لك.</p>\n<aside class=\"callout callout-mistake\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg><span><span class=\"callout-kind\">خطأ شائع</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>استخدام ‎.loc بالمواقع على فهرس افتراضي</span></p>\n<p>في جدول حُمّل للتو بالفهرس الافتراضي من 0 إلى n، تصادف أن تتساوى التسميات والمواقع، فتعيد <code dir=\"ltr\">.loc[0]</code> و<code dir=\"ltr\">.iloc[0]</code> الصف نفسه. الكود المكتوب بهذه الطريقة يعمل حتى أول ترتيب أو تصفية، ثم يلتقط بصمت الصف الخطأ. قرّر ما الذي تقصده، وعبّر عنه بالأداة الصحيحة.</p>\n</aside>\n<aside class=\"callout callout-tip\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\"/><path d=\"M9 18h6\"/><path d=\"M10 22h4\"/></svg><span><span class=\"callout-kind\">نصيحة</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>خطوة واحدة لا خطوتان</span></p>\n<p>فضّل <code dir=\"ltr\">products.loc[7, &quot;unit_price&quot;]</code> على <code dir=\"ltr\">products[&quot;unit_price&quot;][7]</code>. القراءة تعمل بالطريقتين، لكن الشكل الثاني عمليتا اختيار منفصلتان. والنمط نفسه ذو الخطوتين حين يُستخدم <strong>لإسناد</strong> قيمة هو الإسناد المتسلسل (chained assignment)، الذي تحذّر منه pandas ويتوقّف عن العمل تمامًا مع Copy-on-Write. اكتساب عادة الخطوة الواحدة الآن يحميك من ذلك في الدرس 2.5.</p>\n</aside>\n<p>في التمرين تجيب عن أسئلة مدير المنتجات باستخدام <code dir=\"ltr\">.loc</code> و<code dir=\"ltr\">.iloc</code>. وفي الدرس التالي تختار الصفوف بحسب شرط بدلًا من التسمية: “كل الطلبات التي تتجاوز 200 دولار”، “كل طلبات الويب في نوفمبر”.</p>\n","toc":[{"id":"sec-1","text":"الأعمدة أولًا","level":2},{"id":"sec-2","text":"‎.loc: الاختيار بالتسمية","level":2},{"id":"sec-3","text":"‎.iloc: الاختيار بالموقع","level":2},{"id":"sec-4","text":"لماذا يهم الفرق: الترتيب","level":2}],"takeaways":["<code dir=\"ltr\">df[&quot;col&quot;]</code> تعيد عمودًا واحدًا على هيئة Series؛ و<code dir=\"ltr\">df[[&quot;a&quot;, &quot;b&quot;]]</code> (قائمة داخل الأقواس) تعيد DataFrame.","<code dir=\"ltr\">.loc[rows, columns]</code> تختار بالتسمية، والشرائح فيها تشمل التسمية الأخيرة.","<code dir=\"ltr\">.iloc[rows, columns]</code> تختار بالموقع، والشرائح فيها تستبعد النهاية، تمامًا مثل قوائم Python.","بعد الترتيب تبقى التسميات ملتصقة بصفوفها، فتجد <code dir=\"ltr\">.loc</code> المنتج نفسه، بينما تجد <code dir=\"ltr\">.iloc[0]</code> أيًّا كان الصف الذي صار أولًا.","اجعل الفهرس شيئًا له معنى مثل <code dir=\"ltr\">product_id</code> باستخدام <code dir=\"ltr\">index_col=</code> أو <code dir=\"ltr\">set_index()</code>، كي تُقرأ <code dir=\"ltr\">.loc</code> كعملية بحث."],"further":[{"title":"Indexing and selecting data","url":"https://pandas.pydata.org/docs/user_guide/indexing.html"},{"title":"pandas.DataFrame.loc","url":"https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html"},{"title":"pandas.DataFrame.iloc","url":"https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.iloc.html"}],"quiz":[{"q":"<p>فهرس <code dir=\"ltr\">products</code> هو <code dir=\"ltr\">product_id</code> (من 1 إلى 48). كم صفًا تعيد <code dir=\"ltr\">products.loc[1:5]</code>؟</p>","options":[{"text":"4","why":"هذا ما تعطيه شريحة بالموقع تستبعد النهاية. أما <code dir=\"ltr\">.loc</code> فتقطّع بالتسمية وتشمل النهاية."},{"text":"6","why":"التسميات 1 و2 و3 و4 و5 خمسة صفوف؛ لا شيء في هذه الشريحة يصل إلى صف سادس."},{"text":"خطأ، لأن 1:5 مواقع","why":"مع فهرس من أعداد صحيحة، تعامل <code dir=\"ltr\">.loc</code> الأرقام على أنها تسميات، وهذه التسميات موجودة."},{"text":"5","why":"صحيح. شرائح <code dir=\"ltr\">.loc</code> تشمل الطرفين، فتعود التسميات من 1 إلى 5."}],"answer":3},{"q":"<p>رتّبت <code dir=\"ltr\">products</code> بحسب السعر، الأعلى أولًا. أيّ تعبير يعيد صف المنتج الأغلى؟</p>","options":[{"text":"<code dir=\"ltr\">by_price.loc[1]</code>","why":"<code dir=\"ltr\">.loc[1]</code> هو الصف المسمّى 1، أي Cast Iron Skillet، أينما أصبح موقعه."},{"text":"<code dir=\"ltr\">by_price[0]</code>","why":"الأقواس المربعة مع قيمة واحدة تبحث عن عمود اسمه 0، وهذا يسبّب <code dir=\"ltr\">KeyError</code>."},{"text":"<code dir=\"ltr\">by_price.iloc[1]</code>","why":"المواقع تبدأ من 0، فهذا هو ثاني أغلى منتج."},{"text":"<code dir=\"ltr\">by_price.iloc[0]</code>","why":"صحيح. بعد الترتيب يحمل الموقع 0 المنتج الأغلى، أيًّا كانت تسميته."}],"answer":3},{"q":"<p>ماذا تعيد <code dir=\"ltr\">products[[&quot;name&quot;]]</code> مقارنةً بـ <code dir=\"ltr\">products[&quot;name&quot;]</code>؟</p>","options":[{"text":"الـ Series نفسها تمامًا.","why":"الأقواس المزدوجة تمرّر قائمة أعمدة، وهذا يعيد دائمًا DataFrame، حتى لعمود واحد."},{"text":"DataFrame من عمود واحد بدلًا من Series.","why":"صحيح. القائمة داخل الأقواس تعني “هذه الأعمدة، على هيئة جدول”. بعض الدوال تحتاج DataFrame وبعضها Series، لذا الفرق مهم."},{"text":"اسم العمود كنص.","why":"الشكلان يعيدان بيانات لا التسمية. أما <code dir=\"ltr\">products.columns</code> فتسرد الأسماء."}],"answer":1},{"q":"<p>أيّ سطر يعطيك سعر الوحدة للمنتج 7 في خطوة واحدة واضحة؟</p>","options":[{"text":"<code dir=\"ltr\">products.loc[7, &quot;unit_price&quot;]</code>","why":"صحيح. استدعاء واحد لـ <code dir=\"ltr\">.loc</code> بتسمية صف وتسمية عمود يختار قيمة واحدة بالضبط."},{"text":"<code dir=\"ltr\">products.iloc[7, &quot;unit_price&quot;]</code>","why":"لا تقبل <code dir=\"ltr\">.iloc</code> إلا المواقع؛ اسم العمود يسبّب خطأ، والموقع 7 هو المنتج 8 على أي حال."},{"text":"<code dir=\"ltr\">products[&quot;unit_price&quot;][7]</code>","why":"يعمل بالمصادفة للقراءة، لكنه خطوتا اختيار؛ والنمط نفسه حين يُستخدم للإسناد هو الإسناد المتسلسل (chained assignment) الذي يتعطّل مع Copy-on-Write."}],"answer":0}],"exercise":{"kind":"python","files":["products.csv"],"starter":"import pandas as pd\n\nproducts = pd.read_csv(\"products.csv\", index_col=\"product_id\")\n\n# 1. Unit price of product 7 (a single number)\ngrinder_price = None\n\n# 2. Rows for products 11, 21 and 37, with only the name and unit_cost columns\nsubset = None\n\n# 3. The five most expensive products (all columns), most expensive first\ntop5 = None\n\n# 4. The name of the cheapest product\ncheapest_name = None\n","solution":"import pandas as pd\n\nproducts = pd.read_csv(\"products.csv\", index_col=\"product_id\")\n\ngrinder_price = products.loc[7, \"unit_price\"]\n\nsubset = products.loc[[11, 21, 37], [\"name\", \"unit_cost\"]]\n\nby_price = products.sort_values(\"unit_price\", ascending=False)\ntop5 = by_price.iloc[:5]\n\ncheapest_name = by_price.iloc[-1][\"name\"]\n","checks":[{"id":"grinder","test":"float(grinder_price) == 129.0"},{"id":"subset","test":"isinstance(subset, pd.DataFrame) and list(subset.index) == [11, 21, 37] and list(subset.columns) == ['name', 'unit_cost']"},{"id":"top5","test":"isinstance(top5, pd.DataFrame) and len(top5) == 5 and list(top5['unit_price']) == [449, 329, 289, 199, 189]"},{"id":"top5-columns","test":"'name' in top5.columns and 'unit_cost' in top5.columns"},{"id":"cheapest","test":"cheapest_name == 'Jump Rope Pro'"}],"title":"أجب مدير المنتجات","prompt":"<p>حُمّل <code dir=\"ltr\">products</code> مع <code dir=\"ltr\">product_id</code> فهرسًا له. اجعل <code dir=\"ltr\">grinder_price</code> سعر الوحدة للمنتج 7. واجعل <code dir=\"ltr\">subset</code> المنتجات 11 و21 و37 مع العمودين <code dir=\"ltr\">name</code> و<code dir=\"ltr\">unit_cost</code> فقط، بهذا الترتيب. واجعل <code dir=\"ltr\">top5</code> أغلى خمسة منتجات بكل أعمدتها، الأغلى أولًا. واجعل <code dir=\"ltr\">cheapest_name</code> اسم المنتج الأرخص.</p>\n","hints":["المنتج 7 تسمية، فاستخدم <code dir=\"ltr\">.loc[7, &quot;unit_price&quot;]</code>.","تأخذ <code dir=\"ltr\">.loc</code> قائمة بتسميات الصفوف وقائمة بأسماء الأعمدة: <code dir=\"ltr\">.loc[[11, 21, 37], [&quot;name&quot;, &quot;unit_cost&quot;]]</code>.","رتّب بـ <code dir=\"ltr\">products.sort_values(&quot;unit_price&quot;, ascending=False)</code>، ثم خذ المواقع بـ <code dir=\"ltr\">.iloc[:5]</code>. المنتج الأرخص في الموقع <code dir=\"ltr\">-1</code> من ذلك الجدول المرتّب (أو في الموقع 0 من ترتيب تصاعدي)."],"explanation":"<p>معرّفات المنتجات تسميات، لذا <code dir=\"ltr\">.loc</code> هي الأداة الصحيحة للسؤالين 1 و2، وهي تعيد الأعمدة بالترتيب الذي تذكره. أما “أغلى خمسة” فتتعلّق بالموقع بعد الترتيب، فتكون <code dir=\"ltr\">.iloc[:5]</code> على الجدول المرتّب هي الخيار الطبيعي؛ وتعمل أيضًا <code dir=\"ltr\">nlargest(5, &quot;unit_price&quot;)</code> التي ستتعرّف عليها في الدرس القادم. المنتج الأرخص هو Jump Rope Pro بسعر 18 دولارًا. لاحظ أن <code dir=\"ltr\">.loc[1:5]</code> على الجدول المرتّب لن تعطيك الخمسة الأوائل: ستعيد أيّ صفوف تقع بين التسميتين 1 و5 في مواقعها الجديدة، ولا علاقة لذلك بالسعر.</p>\n","checkLabels":{"grinder":"<code dir=\"ltr\">grinder_price</code> يساوي 129","subset":"<code dir=\"ltr\">subset</code> فيه المنتجات 11 و21 و37 والعمودان name و unit_cost","top5":"<code dir=\"ltr\">top5</code> يحمل أعلى خمسة أسعار بترتيب تنازلي","top5-columns":"<code dir=\"ltr\">top5</code> يحتفظ بكل الأعمدة","cheapest":"<code dir=\"ltr\">cheapest_name</code> يساوي Jump Rope Pro"}},"words":585,"readMinutes":3}