لقد جربت الوظيفة df.iterrows()
لكن أداؤها مروع. وهذا ليس مفاجئًا نظرًا لأن iterrows()
يُرجع Series
بمخطط كامل وبيانات وصفية ، وليس فقط القيم (التي كل ما أحتاجه).
الطريقة الثانية التي جربتها هي for row in df.values
، وهي أسرع بكثير. ومع ذلك ، فقد أدركت مؤخرًا أن df.values
ليس هو تخزين البيانات الداخلية لإطار البيانات ، لأن df.values
يحول كل dtypes
إلى dtype
. على سبيل المثال ، يحتوي أحد أعمدتي على dtype int64
لكن النوع dtype df.values
هو بالكامل float64
. لذلك أظن أن df.values
ينشئ بالفعل نسخة أخرى من البيانات الداخلية.
هناك أيضًا مطلب آخر وهو أن تكرار الصف يجب أن يعرض قائمة من القيم التي تحافظ على القيمة الأصلية dtype
للبيانات.
في 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! هذا هو ما احتاجه.
التعليق الأكثر فائدة
أعتقد أن
df.itertuples()
هو ما تبحث عنه - إنه أسرع بكثير من التكرارات: