• 0

تحويل نوع العناصر في الأعمدة في pandas الي نوع أخر مختلف

لدي بيانات علي شكل dataframe في pandas:

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

وأود أن أقوم بتحويل نوع بعض الأعمدة من نوع الى أخر، مثلا من string  إلى int64 أو الى float، كيف يمكنني فعل ذلك؟

2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

في pandas توجد الدالة  astype() والتي تقوم بالتحويل الى أي نوع من البيانات تريد، ويمكنها تحويل البيانات سواء كانت على الشكل dataframe أو series.

الأكواد التالية توضح بعض الأمثلة لهذا:

# التحويل الي int
df = df.astype(int)

# تحويل العمود a اليint والعمود b الي complex
df = df.astype({"a": int, "b": complex})

# التحويل الي float64
s = s.astype(np.float16)

# التحويل الي string 
s = s.astype(str)

لكن يجب أن تحذر أثناء استخدامك لها لانها قد تؤدي في بعض الأحيان الى تحويل خاطئ:

>>> s = pd.Series([1, 5, -11])
>>> s
0    1
1    5
2   -11
dtype: int64

لاحظ ماذا يحدث عند التحويل:

>>> s.astype(np.uint8)
0      1
1      5
2    245
dtype: uint8

لأن القيمة -7 صغيرة، قام بعمل خطأ أثناء تحويلها الى uint8 وذلك لان القيم السالبة خارج نطاق uint8 ، لكنه لم يقم باظهار خطأ وانما قام بعمل حساب خاطئ، لذا يجب أن تعرف ما الذي تقوم بتحويله وهل هو مناسب أم لا.

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

يمكنك أيضاً استخدام DataFrame.apply كالتالي:

import pandas as pd
df = pd.DataFrame({
	'c1': [1, 2, '6', '8']})
print(df.dtypes)
"""
c1    object
dtype: object
"""
# التحويل
df['c1'] = df['c1'].apply(pd.to_numeric)
print(df.dtypes)
"""
c1    int64
dtype: object
"""
# pandas.to_datetime نمط البيانات apply ويمكنك أن تمرر للدالة 
#pandas.to_timedeltaيمكنك أيضاً تمرير 

كما يمكنك استخدام DataFrame.infer_objects حيث تحاول هذه الطريقة إجراء تحويل بسيط عن طريق استنتاج نوع بيانات الأعمدة من النوع "object". ويتم ترك الأعمدة non-object وغير القابلة للتحويل دون تغيير.:

import pandas as pd
df = pd.DataFrame({
	'A': [1, 2, 3, 4, 5],
	'B': ['a', 'b', 'c', 'd', 'e'],
	'C': [1.1, 2.1, 3.0, 4.1, 5.1]
	}, dtype ='object')
print(df.dtypes)
"""
A    object
B    object
C    object
dtype: object
"""
# التحويل
df = df.infer_objects()
print(df.dtypes)
"""
A      int64
B     object
C    float64
dtype: object
"""

كما ويمكنك أن تستخدم الدالة apply لتغيير نمط بيانات عمود واحد أو عدة أعمدة أو كامل الداتافريم:

import pandas as pd
df = pd.DataFrame({
	'c1': [4, 5],
	'c2': ['k', 'b'],
	'c3': [9.1, '7.7'] })
# استخدام قاموس لتحديد الأنماط الجديدة للأعمدة التي نريدها فقط
_dict = {'c1': int,
				'c3': float
			}
df = df.astype(_dict)
print(df.dtypes)
"""
c1      int64
c2     object
c3    float64
dtype: object
"""

مثال إضافي على هذه الدالة:

d = {'c1': [1, 2], 'c2': [3, 4]}
df = pd.DataFrame(data=d)
"""
df.dtypes
c1    int64
c2    int64
dtype: object
"""
# تغيير النمط
df.astype('int32').dtypes
"""
c1    int32
c2    int32
dtype: object
"""

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن