اذهب إلى المحتوى

السؤال

نشر

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

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

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

Recommended Posts

  • 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 ، لكنه لم يقم باظهار خطأ وانما قام بعمل حساب خاطئ، لذا يجب أن تعرف ما الذي تقوم بتحويله وهل هو مناسب أم لا.

  • 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
"""

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...