Pandas: ما هي الطريقة الأكثر فاعلية للتكرار عبر DataFrame من Pandas صفًا بعد؟

تم إنشاؤها على ١٢ يونيو ٢٠١٥  ·  6تعليقات  ·  مصدر: pandas-dev/pandas

لقد جربت الوظيفة df.iterrows() لكن أداؤها مروع. وهذا ليس مفاجئًا نظرًا لأن iterrows() يُرجع Series بمخطط كامل وبيانات وصفية ، وليس فقط القيم (التي كل ما أحتاجه).

الطريقة الثانية التي جربتها هي for row in df.values ، وهي أسرع بكثير. ومع ذلك ، فقد أدركت مؤخرًا أن df.values ليس هو تخزين البيانات الداخلية لإطار البيانات ، لأن df.values يحول كل dtypes إلى dtype . على سبيل المثال ، يحتوي أحد أعمدتي على dtype int64 لكن النوع dtype df.values هو بالكامل float64 . لذلك أظن أن df.values ينشئ بالفعل نسخة أخرى من البيانات الداخلية.

هناك أيضًا مطلب آخر وهو أن تكرار الصف يجب أن يعرض قائمة من القيم التي تحافظ على القيمة الأصلية dtype للبيانات.

Usage Question

التعليق الأكثر فائدة

أعتقد أن df.itertuples() هو ما تبحث عنه - إنه أسرع بكثير من التكرارات:

In [10]: x = pd.DataFrame({'x': range(10000)})

In [11]: %timeit list(x.iterrows())
1 loops, best of 3: 383 ms per loop

In [12]: %timeit list(x.itertuples())
1000 loops, best of 3: 1.39 ms per loop

ال 6 كومينتر

في Python ، سيكون التكرار على الصفوف أبطأ (كثيرًا) من إجراء العمليات الموجهة.

يتم تحويل الأنواع في طريقتك الثانية لأن هذه هي طريقة عمل المصفوفات المعقدة (وهو ما يعمل به df.values ). تستند DataFrames إلى الأعمدة ، لذا يمكنك الحصول على DataFrame واحد مع أنواع متعددة. بمجرد التكرار على الرغم من التجديف ، يجب أن يكون كل شيء مقلقًا إلى نوع أكثر عمومية يحمل كل شيء. في حالتك ، تذهب ints إلى float64 .

إذا وصفت مشكلتك بأدنى مثال عملي ، فقد نتمكن من مساعدتك في توجيهها. قد يحالفك الحظ أيضًا في StackOverflow مع علامة الباندا.

في الأساس ، أريد أن أفعل ما يلي:

row_handler = RowHandler(sample_df)  # learn how to handle row from sample data
transformed_data = []
for row in df.values:
    transformed_data.append(row_handler.handle(row))
return transformed_data

أنا لا أمتلك فئة RowHandler وبالتالي لا يمكنني تشغيل سوى صف بصف.

مثال آخر مشابه هو التعلم الآلي ، حيث قد يكون لديك نموذج توقع API على مستوى الصف فقط.

لا يزال غامضا بعض الشيء ليكون مفيدا. ولكن إذا كان RowHandler خارجًا عن إرادتك حقًا ، فلن يحالفك الحظ. FWIW تعمل جميع واجهات برمجة التطبيقات الخاصة بـ scikit-Learn على مصفوفات (صفوف متعددة جدًا).

لا أرى كيف يمكن أن يكون أوضح. نعم ، RowHandler خارج عن إرادتي. ماذا تقصد بغير حظ؟ سؤالي هو الطريقة الأكثر فعالية للتكرار على الصفوف مع الحفاظ على dtype لكل عنصر كما هو. هل تقترح df.iterrows() أم شيء آخر؟

sklearn هو استثناء ، وليس القاعدة ، يعمل أصلاً على PD DataFrame . لا يوجد لدى العديد من مكتبات التعلم الآلي واجهات برمجة تطبيقات تعمل على DataFrame .

أعتقد أن df.itertuples() هو ما تبحث عنه - إنه أسرع بكثير من التكرارات:

In [10]: x = pd.DataFrame({'x': range(10000)})

In [11]: %timeit list(x.iterrows())
1 loops, best of 3: 383 ms per loop

In [12]: %timeit list(x.itertuples())
1000 loops, best of 3: 1.39 ms per loop

شكرا @ shoyer! هذا هو ما احتاجه.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات