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

إزالة الصفوف التي تحتوي علي قيم NaN في بعض الأعمدة في pandas

Mohamed Elnemr

السؤال

لدي بيانات على شكل dataframe وأريد فقط الإبقاء على البيانات التي تحتوي قيم العمود value على قيم لا تساوي NaN

>>> df
                   ID   value  cash
ID      Date                   
601166 20111231  601166  NaN   NaN
600036 20111231  600036  NaN    12
600016 20111231  600016  4.3   NaN
601009 20111231  601009  NaN   NaN
601939 20111231  601939  2.5   NaN

بحيث يكون الخرج النهائي كالتالي:

                   ID  value  cash
   ID   Date                   
600016 20111231  600016  4.3   NaN
601939 20111231  601939  2.5   NaN

 كيف يمكنني فعل هذا؟

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

Recommended Posts

  • 0

إليك العديد من الطرق:

import pandas as pd

df = pd.DataFrame({'c1': ['100','DDD','646','XYZ','888'],
                   'c2': ['AAA','000','999','500','1000'] 
                   })
#لنجرب عليها Nan جعل بعض القيم 
df = df.apply (pd.to_numeric, errors='coerce')
df
"""
    c1     	c2
0 	100.0 	NaN
1 	NaN   	0.0
2 	646.0 	999.0
3 	NaN   	500.0
4 	888.0 	1000.0
"""
############################ استخدام pd.notnull ##################################
df[pd.notnull(df['c2'])]
"""
    c1   	c2
1 	NaN 	0.0
2 	646.0 999.0
3 	NaN 	500.0
4 	888.0 1000.0
"""
############################# isnull ############################################
df[~df.c2.isnull()]
"""
    c1     	c2
1 	NaN 	  0.0
2 	646.0 	999.0
3 	NaN 	  500.0
4 	888.0 	1000.0
"""
############################# isnan ##########################################
df[~np.isnan(df.c2)]
"""
    c1   	c2
1 	NaN 	0.0
2 	646.0 999.0
3 	NaN 	500.0
4 	888.0 1000.0
"""
#########################  أو بالشكل العبقري التالي ##########################
df.query("c2 == c2") # np.nan==np.nan # False
"""
c1 	c2
1 	NaN 	0.0
2 	646.0 	999.0
3 	NaN 	500.0
4 	888.0 	1000.0
"""
############################ dropna حل آخر وهو استخدام ########################### 
df.dropna() #nan ستؤدي لحذف كل صف يحوي قيم 
"""
    c1 	    c2
2 	646.0 	999.0
4 	888.0 	1000.0
"""
# بعد عملية الحذف سيكون الفهرس مبعثر كما رأينا لذا يجب أن نقوم بإعادة ضيطه
# df.reset_index(drop=True)
df.dropna(subset=['c2']) # ستؤدي لحذف الصف الأول فقط
"""
    c1   	c2
1 	NaN 	0.0
2 	646.0 999.0
3 	NaN 	500.0
4 	888.0 1000.0
"""
#على الأقل nan لحذف الصف في حال احتوى على قيمتي 
df.dropna(thresh=2) # يمكنك تحديد العدد الذي يناسبك
#يو how='all' استخدام 
df["c2"].dropna(how='all')

 

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

  • 0

هناك عدة طرق للقيام بهذا، مثلا يمكنك فقط الابقاء على الصفوف التي تحتوى على قيم بدلا من إزالة الصفوف التي تحتوى على NaN كالتالي:

df = df[df['value'].notna()]

أو يمكنك إزالة الصفوف التي تحتوى على قيم NaN كالتالي:

df.dropna(subset=['value'])

اما اذا أردت ازالة الصف اذا كان كل قيم أعمدته ب NaN يمكنك استخدام الكود التالي:

df.dropna(how='all')

 

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

  • 0

يمكنك أيضاً استخدام الدالة notnull ببساطة كالتالي

import pandas as pd
df = df[pd.notnull(df['value'])]

أو يمكنك عكس الدالة isnull كالتالي

 df[~df.value.isnull()]

أو isnan

df[~np.isnan(df.value)]

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...