python - يأكل - هل دب الباندا مفترس؟




تغيير نوع البيانات من الأعمدة في الباندا (4)

أرغب في تحويل جدول ، يتم تمثيله كقائمة من القوائم ، في Pandas DataFrame. كمثال مبسط للغاية:

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a)

ما هي أفضل طريقة لتحويل الأعمدة إلى الأنواع المناسبة ، في هذه الحالة ، العمودان 2 و 3 في الطفو؟ هل هناك طريقة لتحديد الأنواع أثناء التحويل إلى DataFrame؟ أم أنه من الأفضل إنشاء DataFrame أولاً ثم إجراء حلقة عبر الأعمدة لتغيير نوع كل عمود؟ من الناحية المثالية ، أود أن أفعل ذلك بطريقة ديناميكية لأنه يمكن أن يكون هناك مئات الأعمدة ولا أريد تحديد أي الأعمدة بالضبط من أي نوع. كل ما يمكنني ضمانه هو أن كل عمود يحتوي على قيم من نفس النوع.


ماذا عن إنشاء مجموعتي بيانات ، لكل منهما أنواع بيانات مختلفة لأعمدتهما ، ثم إلحاقهما ببعضهما البعض؟

d1 = pd.DataFrame(columns=[ 'float_column' ], dtype=float)
d1 = d1.append(pd.DataFrame(columns=[ 'string_column' ], dtype=str))

النتائج

In[8}:  d1.dtypes
Out[8]: 
float_column     float64
string_column     object
dtype: object

بعد إنشاء مخطط البيانات ، يمكنك ملؤه باستخدام متغيرات النقطة العائمة في العمود الأول ، والسلاسل (أو أي نوع بيانات ترغب فيه) في العمود الثاني.


هذا رمز أدناه سوف يغير نوع البيانات من العمود.

df[['col.name1', 'col.name2'...]] = df[['col.name1', 'col.name2'..]].astype('data_type')

بدلا من نوع البيانات التي يمكن أن تعطي نوع البيانات الخاص بك. ماذا تريد مثل str ، تعويم ، كثافة العمليات ، إلخ.


وماذا عن هذا؟

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
df
Out[16]: 
  one  two three
0   a  1.2   4.2
1   b   70  0.03
2   x    5     0

df.dtypes
Out[17]: 
one      object
two      object
three    object

df[['two', 'three']] = df[['two', 'three']].astype(float)

df.dtypes
Out[19]: 
one       object
two      float64
three    float64

يمكنك استخدام pd.to_numeric (تم إدخاله في الإصدار 0.17) لتحويل عمود أو سلسلة إلى نوع رقمي. يمكن أيضًا تطبيق الوظيفة على عدة أعمدة من DataFrame باستخدام apply .

والأهم من ذلك ، أن الدالة تأخذ أيضًا وسيطة الكلمات الرئيسية errors التي تسمح لك بفرض القيم غير الرقمية على NaN ، أو ببساطة تجاهل الأعمدة التي تحتوي على هذه القيم.

يتم عرض أمثلة الاستخدام أدناه.

عمود فردي / سلسلة

في ما يلي مثال على ذلك باستخدام سلسلة من السلاسل التي تحتوي على الكائن dtype:

>>> s = pd.Series(['1', '2', '4.7', 'pandas', '10'])
>>> s
0         1
1         2
2       4.7
3    pandas
4        10
dtype: object

يتمثل السلوك الافتراضي للوظيفة في الزيادة إذا تعذر تحويل قيمة. في هذه الحالة ، لا يمكن التعامل مع السلسلة "الباندا":

>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')
ValueError: Unable to parse string

بدلاً من الفشل ، قد نرغب في اعتبار "الباندا" قيمة مفقودة / سيئة. يمكننا إجبار القيم غير الصحيحة على NaN النحو التالي:

>>> pd.to_numeric(s, errors='coerce')
0     1.0
1     2.0
2     4.7
3     NaN
4    10.0
dtype: float64

الخيار الثالث هو مجرد تجاهل العملية في حالة مواجهة قيمة غير صالحة:

>>> pd.to_numeric(s, errors='ignore')
# the original Series is returned untouched

أعمدة متعددة / كامل DataFrames

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

اقتراض DataFrame من السؤال:

>>> a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
>>> df = pd.DataFrame(a, columns=['col1','col2','col3'])
>>> df
  col1 col2  col3
0    a  1.2   4.2
1    b   70  0.03
2    x    5     0

ثم يمكننا أن نكتب:

df[['col2','col3']] = df[['col2','col3']].apply(pd.to_numeric)

والآن أصبح "col2" و "col3" dtype float64 حسب الرغبة.

ومع ذلك ، قد لا نعرف أي من أعمدةنا يمكن تحويلها بشكل موثوق إلى نوع رقمي. في هذه الحالة ، يمكننا فقط كتابة:

df.apply(pd.to_numeric, errors='ignore')

ثم سيتم تطبيق الوظيفة على كامل DataFrame. سيتم تحويل الأعمدة التي يمكن تحويلها إلى نوع رقمي ، في حين سيتم ترك الأعمدة التي لا يمكن (على سبيل المثال أنها تحتوي على سلاسل غير أرقام أو تواريخ) وحدها.

هناك أيضًا pd.to_datetime و pd.to_timedelta للتحويل إلى التواريخ pd.to_timedelta الزمنية.

التحويلات الناعمة

يقدم الإصدار 0.21.0 الأسلوب infer_objects() لتحويل أعمدة من DataFrame تحتوي على نوع بيانات كائن لنوع أكثر تحديدًا.

على سبيل المثال ، لنقم بإنشاء DataFrame مع عمودين من نوع الكائن ، مع عدد صحيح واحد من الأعداد و سلاسل الإمساك الأخرى للأعداد الصحيحة:

>>> df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3','2','1']}, dtype='object')
>>> df.dtypes
a    object
b    object
dtype: object

ثم باستخدام infer_objects() ، يمكننا تغيير نوع العمود "أ" إلى int64:

>>> df = df.infer_objects()
>>> df.dtypes
a     int64
b    object
dtype: object

تم ترك العمود "ب" بمفرده حيث كانت قيمه عبارة عن سلاسل ، وليس صحيحًا. إذا أردنا محاولة فرض تحويل كلا العمودين إلى نوع صحيح ، فيمكننا استخدام df.astype(int) بدلاً من ذلك.





casting