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

السؤال

نشر

أحاول حفظ مصفوفة numpy إلى قاعدة بيانات mysql باستخدام MysqlDB. لا يبدو أن MysqlDB يفهم "nan" وقاعدة بياناتي تطرح خطأ يقول إن nan ليس في قائمة الحقول. أحتاج إلى إيجاد طريقة لتحويل "nan" إلى NoneType.

هل توجد دالة جاهزة تقوم بهذا الأمر؟

Recommended Posts

  • 0
نشر

يمكنك استخدام where، ومن الجدير بالذكر أنه يمكنك القيام بذلك في الباندا:

df1 = df.where(pd.notnull(df), None)

ملاحظة: يؤدي هذا إلى تغيير نوع dtype لجميع الأعمدة إلى النوع object.

مثال:

In [1]: df = pd.DataFrame([1, np.nan])

In [2]: df
Out[2]: 
    0
0   1
1 NaN

In [3]: df1 = df.where(pd.notnull(df), None)

In [4]: df1
Out[4]: 
      0
0     1
1  None

ملاحظة: ما لا يمكنك القيام به هو إعادة صياغة إطارات البيانات dtype للسماح لجميع أنواع البيانات ، باستخدام astype ، ثم دالة إطارالبيانات fillna :

df1 = df.astype(object).replace(np.nan, 'None')

لسوء الحظ ، لا يعمل هذا ، ولا يستخدم replace، مع None.

من الجدير بالذكر أنه في معظم حالات الاستخدام لا تحتاج إلى استبدال NaN بـ None.

  • 0
نشر

اذا كانت شكل المصفوفة على هيئة numpy ، يمكنك استخدام الدالة التالية:

numpy.nan_to_num(x, copy=True, nan=0.0, posinf=None, neginf=None)

والتي تقوم باخذ مصفوفة بها قيم nan وتحويلها لاي قيم تريدها.

اما عن تبديل القيم nan الي none فلا توجد طريقة مباشره من Numpy، فقط يجب عليك تحويلها الي dataframe وذلك لنستطيع استخدام المكتبة pandas. يمكن استخدام الدالة pandas.notnull(obj) للقيام بمثل تلك عملية التحويل، لفهم كيفية استخدامها انظر المثال التالي:

>>> array = np.array([[1, np.nan, 3], [4, 5, np.nan]])
>>> array
array([[ 1., nan,  3.],
       [ 4.,  5., nan]])
>>>pd.notna(array)
array([[ True, False,  True],
       [ True,  True, False]])

اما عن حالتك فيمكنك استخدام الدالة كالتالي:

df1 = df.astype(object).replace(np.nan, 'None')

أو استخدام الدالة التالية:

>>> df1 = df.where(pd.notnull(df), None)

>>> df1

      0
0     1
1  None

 

  • 2
نشر (معدل)

يمكنك القيام بذلك بالشكل التالي في باندا:

df = df.astype(object).where(pd.notnull(df),None)

ويمكنك استبدال nan بـ None في مصفوفة numpy الخاصة بك من خلال استخدام التابع np.where حيث نمرر له كوسيط أول القيمة المعادة من تطبيق التابع np.isnan على المصفوفة الخاصة بك، ثم القيمة المراد الاستبدال بها، ثم المصفوفة:

arr = np.array([4, np.nan])
arr = np.where(np.isnan(arr), None, arr) # [4.0 None]
print type(arr[1])
#<type 'NoneType'>

كما ويمكنك القيام بذلك بسهولة من خلال التابع replace في باندا:

df = df.replace({np.nan: None})

وللتحويل من none ل nan:

import numpy as np
x = np.array([3,4,None,55])
x = np.array(x,dtype=float)
x
#array([ 3.,  4., nan, 55.])
# أو
x = np.array(x)
x.astype(float)
#array([ 3.,  4., nan, 55.])

 

تم التعديل في بواسطة Ali Haidar Ahmad

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...