python - اختيار صف من سلسلة الباندا/dataframe عن طريق مؤشر عدد صحيح




pandas indexing (4)

أنا أشعر بالفضول حول سبب عدم دعم df[2] ، بينما df.ix[2] و df[2:3] .

In [26]: df.ix[2]
Out[26]: 
A    1.027680
B    1.514210
C   -1.466963
D   -0.162339
Name: 2000-01-03 00:00:00

In [27]: df[2:3]
Out[27]: 
                  A        B         C         D
2000-01-03  1.02768  1.51421 -1.466963 -0.162339

أتوقع أن df[2] يعمل بنفس الطريقة مثل df[2:3] لتكون متسقة مع اصطلاح فهرسة Python. هل هناك سبب تصميم لعدم دعم صف الفهرسة بواسطة عدد صحيح واحد؟


الغرض الأساسي من مشغل فهرسة DataFrame ، [] هو تحديد الأعمدة.

عندما يتم تمرير عامل الفهرسة إلى سلسلة أو عدد صحيح ، فإنه يحاول العثور على عمود بهذا الاسم المعين وإعادته كسلسلة.

لذا ، في السؤال أعلاه: df[2] يبحث عن اسم عمود يطابق قيمة العدد الصحيح 2 . هذا العمود غير موجود ويتم رفع KeyError .

يقوم عامل تشغيل فهرسة DataFrame بتغيير السلوك تمامًا لتحديد الصفوف عند استخدام كتابة الشريحة

الغريب أنه عندما يتم إعطاء شريحة ، فإن عامل فهرسة DataFrame يختار الصفوف ويمكنه القيام بذلك عن طريق الموقع الصحيح أو عن طريق ملصق الفهرس.

df[2:3]

سيبدأ هذا بالبدء من الصف مع موقع صحيح 2 حتى 3 ، باستثناء العنصر الأخير. لذلك ، مجرد صف واحد. يختار ما يلي الصفوف التي تبدأ عند عدد صحيح يصل إلى 6 ولكن لا تشمل 20 في كل صف ثالث.

df[6:20:3]

يمكنك أيضًا استخدام الشرائح المكونة من تصنيفات السلسلة إذا كان فهرس DataFrame يحتوي على سلاسل. لمزيد من التفاصيل ، راجع هذا الحل على .iloc vs .loc .

أنا تقريبا أبدا استخدام هذا التدوين شريحة مع مشغل الفهرسة باعتبارها غير واضحة وصعبة الاستخدام. عند .loc/.iloc عن طريق الصفوف ، .loc/.iloc .


للوصول إلى مؤشر إلى جدول الباندا ، يمكن للمرء أيضا النظر في الخيار numpy.as_array لتحويل الجدول إلى مجموعة Numpy كما

np_df = df.as_matrix()

وثم

np_df[i] 

ستعمل.


يمكنك أن تعتقد DataFrame كدليل على سلسلة. df[key] حاول تحديد فهرس العمود key وإرجاع كائن سلسلة.

ومع ذلك ، فإن تشريح الشرائح [] داخل الصفوف ، لأنه عملية شائعة جدًا.

يمكنك قراءة الوثيقة لمزيد من التفاصيل:

http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics


يمكنك إلقاء نظرة على شفرة المصدر .

يحتوي DataFrame على دالة خاصة _slice() DataFrame ، ويسمح axis المعلمة بتحديد المحور الذي DataFrame . لا يقوم __getitem__() لـ DataFrame بتعيين المحور أثناء استدعاء _slice() . لذا فإن _slice() بشكل افتراضي على المحور 0.

يمكنك تجربة بسيطة ، قد تساعدك:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)




indexing