it-swarm.asia

كيف يمكنني استبدال جميع قيم NaN بـ Zero في عمود من قاعدة بيانات الباندا

لدي dataframe على النحو التالي

      itm Date                  Amount 
67    420 2012-09-30 00:00:00   65211
68    421 2012-09-09 00:00:00   29424
69    421 2012-09-16 00:00:00   29877
70    421 2012-09-23 00:00:00   30990
71    421 2012-09-30 00:00:00   61303
72    485 2012-09-09 00:00:00   71781
73    485 2012-09-16 00:00:00     NaN
74    485 2012-09-23 00:00:00   11072
75    485 2012-09-30 00:00:00  113702
76    489 2012-09-09 00:00:00   64731
77    489 2012-09-16 00:00:00     NaN

عندما أحاول تطبيق وظيفة في عمود المبلغ ، أحصل على الخطأ التالي.

ValueError: cannot convert float NaN to integer

لقد حاولت تطبيق دالة باستخدام .isnan من Math Module. لقد جربت سمة pandas .replace. جربت سمة .sparse data من pandas 0.9. جربت أيضًا إذا كانت NaN == NaN statement في دالة. لقد ألقيت نظرة أيضًا على هذه المقالة كيف يمكنني استبدال قيم NA بالأصفار في إطار بيانات R؟ أثناء النظر في بعض المقالات الأخرى. جميع الطرق التي جربتها لم تنجح أو لا تتعرف على NaN. أي تلميحات أو حلول سيكون موضع تقدير.

341
George Thompson

أعتقد أن DataFrame.fillna() سوف تفعل ذلك من أجلك.

رابط إلى Docs for a dataframe and for a Series .

مثال:

In [7]: df
Out[7]: 
          0         1
0       NaN       NaN
1 -0.494375  0.570994
2       NaN       NaN
3  1.876360 -0.229738
4       NaN       NaN

In [8]: df.fillna(0)
Out[8]: 
          0         1
0  0.000000  0.000000
1 -0.494375  0.570994
2  0.000000  0.000000
3  1.876360 -0.229738
4  0.000000  0.000000

لملء NaNs في عمود واحد فقط ، حدد هذا العمود فقط. في هذه الحالة ، أنا أستخدم inplace = True لتغيير محتويات df بالفعل.

In [12]: df[1].fillna(0, inplace=True)
Out[12]: 
0    0.000000
1    0.570994
2    0.000000
3   -0.229738
4    0.000000
Name: 1

In [13]: df
Out[13]: 
          0         1
0       NaN  0.000000
1 -0.494375  0.570994
2       NaN  0.000000
3  1.876360 -0.229738
4       NaN  0.000000
559
Aman

ليس مضمونًا أن تقوم عملية التقطيع بإرجاع طريقة عرض أو نسخة. يمكنك ان تفعل

df['column'] = df['column'].fillna(value)
85
rakesh

أردت فقط تقديم القليل من التحديث/حالة خاصة لأنه يبدو أن الناس ما زالوا يأتون إلى هنا. إذا كنت تستخدم فهرسًا متعددًا أو كنت تستخدم تقطيع فهرس ، فإن الخيار inplace = True قد لا يكون كافيًا لتحديث الشريحة التي اخترتها. على سبيل المثال ، في مؤشر متعدد المستوى 2 × 2 ، لن يغير هذا أي قيم (اعتبارًا من الباندا 0.15):

idx = pd.IndexSlice
df.loc[idx[:,mask_1],idx[mask_2,:]].fillna(value=0,inplace=True)

"المشكلة" هي أن التسلسل يكسر قدرة fillna على تحديث مخطط البيانات الأصلي. لقد وضعت "مشكلة" في علامات الاقتباس لأن هناك أسباب وجيهة لقرارات التصميم التي أدت إلى عدم الترجمة من خلال هذه السلاسل في مواقف معينة. هذا أيضًا مثال معقد (على الرغم من أنني واجهت ذلك بالفعل) ، ولكن قد ينطبق نفس الشيء على مستويات أقل من الفهارس اعتمادًا على كيفية تقسيمك.

الحل هو DataFrame.update:

df.update(df.loc[idx[:,mask_1],idx[[mask_2],:]].fillna(value=0))

إنه سطر واحد ، يقرأ جيدًا (نوع من) ويزيل أي رسائل غير ضرورية مع متغيرات أو حلقات وسيطة مع السماح لك بتطبيق fillna على أي شريحة متعددة المستويات تريدها!

إذا تمكن أي شخص من العثور على أماكن لا ينجح فيها هذا ، فالرجاء نشره في التعليقات ، لقد كنت أعاني من العبث ونظر إلى المصدر ويبدو أنه يحل على الأقل مشكلات شريحة الشرائح المتعددة.

20
Ezekiel Kruglick

يمكنك استخدام replace لتغيير NaN إلى 0:

import pandas as pd
import numpy as np

# for column
df['column'] = df['column'].replace(np.nan, 0)

# for whole dataframe
df = df.replace(np.nan, 0)

# inplace
df.replace(np.nan, 0, inplace=True)
19
Anton Protopopov

عملت أدناه رمز بالنسبة لي.

import pandas

df = pandas.read_csv('somefile.txt')

df = df.fillna(0)
18
Cornel Ciobanu

طريقة سهلة لملء القيم المفقودة: -

fill أعمدة السلسلة: عندما يكون لأعمدة السلسلة قيم مفقودة وقيم NaN.

df['string column name'].fillna(df['string column name'].mode().values[0], inplace = True)

filling الأعمدة الرقمية: عندما تحتوي الأعمدة الرقمية على قيم مفقودة وقيم NaN.

df['numeric column name'].fillna(df['numeric column name'].mean(), inplace = True)

ملء NaN بصفر:

df['column name'].fillna(0, inplace = True)
4
tulsi kumar

لاستبدال القيم na في الباندا

df['column_name'].fillna(value_to_be_replaced,inplace=True)

إذا inplace = False ، فبدلاً من تحديث df (dataframe) ، فسوف يُرجع القيم المعدلة.

1
Vivek Ananthan

 enter image description here

النظر في العمود المحدد Amount في الجدول أعلاه هو من نوع صحيح. سيكون الحل التالي:

df['Amount'] = df.Amount.fillna(0).astype(int)

وبالمثل ، يمكنك تعبئته بأنواع مختلفة من البيانات مثل float و str وهكذا.

على وجه الخصوص ، أود أن أفكر في نوع البيانات لمقارنة قيم مختلفة من نفس العمود.

0
Bharath_Raja

إذا كنت ترغب في تحويلها إلى قاعدة بيانات pandas ، فيمكنك أيضًا إنجاز ذلك باستخدام fillna.

import numpy as np
df=np.array([[1,2,3, np.nan]])

import pandas as pd
df=pd.DataFrame(df)
df.fillna(0)

سيعود هذا بما يلي:

     0    1    2   3
0  1.0  2.0  3.0 NaN
>>> df.fillna(0)
     0    1    2    3
0  1.0  2.0  3.0  0.0
0
Michael Grogan