আমি কীভাবে প্যান্ডাস ডেটাফ্রেমের কলামে সমস্ত NaN মানগুলি জিরোসের সাথে প্রতিস্থাপন করতে পারি


457

নীচের মত আমার একটি ডেটাফ্রেম আছে

      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

আমি যখন পরিমাণ কলামে একটি ফাংশন প্রয়োগ করার চেষ্টা করি তখন আমি নীচের ত্রুটি পাই get

ValueError: cannot convert float NaN to integer

আমি ম্যাথ মডিউল থেকে .isnan ব্যবহার করে একটি ফাংশন প্রয়োগ করার চেষ্টা করেছি আমি পান্ডার চেষ্টা করেছি। স্থান বৈশিষ্ট্যটি আমি পান্ডাস 0.9 থেকে স্পেস ডেটা অ্যাট্রিবিউটটি চেষ্টা করেছিলাম যদি আমি কোনও ফাংশনে NaN == NaN বিবৃতিটি চেষ্টা করেছি। আমি এই নিবন্ধটিও দেখেছি আমি কীভাবে কোনও আর ডেটাফ্রেমে শূন্যের সাথে এনএ মানগুলি প্রতিস্থাপন করব? কিছু অন্যান্য নিবন্ধ তাকান যখন। আমি যে সমস্ত পদ্ধতি চেষ্টা করেছি সেগুলি এনএএন-কে কাজ করে নি বা স্বীকৃতি দেয় না। কোনও ইঙ্গিত বা সমাধান প্রশংসা করা হবে।


কেবলমাত্র সমস্যাটি df.fill.na () কাজ করে না যদি আপনি যে ডেটা ফ্রেমটি প্রয়োগ করছেন সেটি পুনরায় তৈরি করা হয়েছে বা লোক ফাংশনের মাধ্যমে কাটা হয়েছে
প্রিন্স আগরওয়াল

উত্তর:


754

আমি বিশ্বাস করি DataFrame.fillna()আপনার পক্ষে এটি করবে।

ডেটাফ্রেমের জন্য এবং একটি সিরিজের জন্য ডক্সকে লিঙ্ক করুন ।

উদাহরণ:

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

শুধুমাত্র একটি কলামে NaN পূরণ করতে, কেবলমাত্র সেই কলামটি নির্বাচন করুন। এই ক্ষেত্রে আমি ইনপ্লেস = ডিএফ এর বিষয়বস্তু পরিবর্তন করতে সত্য ব্যবহার করছি।

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

সম্পাদনা করুন:

এড়াতে SettingWithCopyWarning, কলাম-নির্দিষ্ট কার্যকারিতাটিতে অন্তর্নির্মিতটি ব্যবহার করুন:

df.fillna({1:0}, inplace=True)

1
এটি কি নিশ্চিত যে df[1]এটি মূল ডিএফ এর অনুলিপি না করে একটি দৃশ্য? স্পষ্টতই, যদি এটির অনুলিপিপূর্ণ পরিস্থিতি থাকে তবে এটির অনুলিপিটি থাকে, এটি একটি অতি-ঝামেলার বাগের কারণ হতে পারে। পান্ডাস ডকুমেন্টেশনে এর বিষয়ে কি স্পষ্ট বক্তব্য আছে?
সর্বোচ্চ

@ ম্যাক্স এটি দেখুন, আপনার প্রশ্নের সমাধান করতে পারে: stackoverflow.com/questions/23296282/…
আমান

ধন্যবাদ। আমার বোধগম্য কি সঠিক যে উত্তরে একটি "সূচক যা সেট করে" হ'ল বাইরেরতম সূচীকরণ ক্রিয়াকলাপ (অ্যাসাইনমেন্টের ঠিক আগে কার্যকর করা হয় So সুতরাং যে কোনও অ্যাসাইনমেন্ট যা কেবলমাত্র একক সূচক ব্যবহার করে তা আপনার কোডকে সুরক্ষিত করে গ্যারান্টিযুক্ত?
সর্বোচ্চ

1
কেন এটি আমার পক্ষে কাজ করছে না? দেখুন: stackoverflow.com/questions/39452095/how-to-fillna-with-value-0
displayname

1
শেষ উদাহরণটি একটি সেটিংউইথকপি ওয়ার্নিং ছুড়ে ফেলেছে
সিপ করুন

124

এটি গ্যারান্টিযুক্ত নয় যে স্লাইসিং একটি দর্শন বা অনুলিপি প্রদান করে। আপনি করতে পারেন

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

14
সবেমাত্র "insert = true" সমস্যাটি আবিষ্কার হয়েছে। এই উত্তরটি বিষয়টি এড়িয়ে চলে এবং আমি মনে করি যে উপস্থাপিত সবচেয়ে পরিষ্কার সমাধান।
টিমসিরা

48

আপনি এতে 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)

এটি কি কেবল প্রতিস্থাপন করবে NaN? বা এটি মান NAবা কোথায় NaNপছন্দ করবে df.fillna(0)? আমি সমাধান যেখানে আছে যা শুধুমাত্র মানকে প্রতিস্থাপন খোঁজ করছি NaNএবংNA
শ্যাম Bhimani

1
@ শ্যাম ভিমণির এটি কেবলমাত্র NaNমানগুলি প্রতিস্থাপন করা উচিত যেখানে np.isnanসত্য
অ্যান্টন প্রোটোপোভোভ

23

আমি কেবলমাত্র একটি আপডেট / বিশেষ কেস সরবরাহ করতে চেয়েছিলাম যেহেতু দেখে মনে হচ্ছে লোকেরা এখনও এখানে আসে। আপনি যদি কোনও মাল্টি-ইনডেক্স ব্যবহার করছেন বা অন্যথায় ইনড্লেস ইনডেক্স-স্লিকার ব্যবহার করছেন = সত্য বিকল্পটি আপনি পছন্দ করেছেন এমন স্লাইস আপডেট করার জন্য যথেষ্ট নাও হতে পারে। উদাহরণস্বরূপ 2x2 স্তরের মাল্টি-ইনডেক্সে এটি কোনও মান পরিবর্তন করবে না (পান্ডাস 0.15 হিসাবে):

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

"সমস্যা" হ'ল চেইনটি মূল ডেটাফ্রেম আপডেট করার জন্য ফিলেনা ক্ষমতাটি ভেঙে দেয়। আমি উদ্ধৃতিগুলিতে "সমস্যা" রেখেছি কারণ নকশাকৃত সিদ্ধান্তের জন্য বেশ কয়েকটি ভাল কারণ রয়েছে যা নির্দিষ্ট পরিস্থিতিতে এই শৃঙ্খলাগুলির মাধ্যমে ব্যাখ্যা না করে নিয়েছিল। এছাড়াও, এটি একটি জটিল উদাহরণ (যদিও আমি সত্যিই এটিতে ছুটে এসেছি), তবে আপনি কীভাবে টুকরো টুকরো করে তার উপর নির্ভর করে এটি সূচকগুলির কয়েকটি স্তরের ক্ষেত্রেও একই প্রয়োগ হতে পারে।

সমাধানটি ডেটাফ্রেম.আপডেট:

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

এটি একটি লাইন, যুক্তিসঙ্গতভাবে ভাল (ধরণের) পড়তে পারে এবং মধ্যবর্তী ভেরিয়েবলগুলি বা লুপগুলির সাথে কোনও অপ্রয়োজনীয় জগাখিচুড়ি দূর করে যখন আপনি পছন্দ মতো কোনও মাল্টি-লেভেল ফালিতে ফিলেনা প্রয়োগ করতে পারবেন!

যদি কেউ এই জায়গাগুলি খুঁজে পায় তবে এটি কাজ করে না দয়া করে মন্তব্যগুলিতে পোস্ট করুন, আমি এটির সাথে গোলযোগ করছি এবং উত্সটি দেখছি এবং এটি কমপক্ষে আমার মাল্টি-ইনডেক্সের স্লাইস সমস্যার সমাধান বলে মনে হচ্ছে।



7

অনুপস্থিত মান পূরণ করার সহজ উপায়: -

ফিলিং স্ট্রিং কলামগুলি: যখন স্ট্রিং কলামগুলিতে মান এবং NaN এর মান থাকে।

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

সংখ্যার কলামগুলি পূরণ করা : যখন সংখ্যার কলামগুলিতে মান এবং NaN মান অনুপস্থিত থাকে।

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

শূন্যের সাথে NaN পূরণ করুন:

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

5

আপনি ডেটাফ্রেমে নির্দিষ্ট কলামগুলির NaN মান পূরণ করার জন্য অভিধানগুলিও ব্যবহার করতে পারেন কিছু ডিভেলের সাথে সমস্ত ডিএফ পূরণ করার জন্য।

import pandas as pd

df = pd.read_excel('example.xlsx')
df.fillna( {
        'column1': 'Write your values here',
        'column2': 'Write your values here',
        'column3': 'Write your values here',
        'column4': 'Write your values here',
        .
        .
        .
        'column-n': 'Write your values here'} , inplace=True)

এটি ওপি-র প্রশ্নের বিকাশকারী উদ্দেশ্য সমাধান।
জনডাঙ্গার

4

এখানে চিত্র বর্ণনা লিখুন

Amountউপরের টেবিলের নির্দিষ্ট কলামটি বিবেচনা করে পূর্ণসংখ্যার ধরণের। নিম্নলিখিতগুলির সমাধান হবে:

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

একইভাবে, আপনি এটি বিভিন্ন ডেটা ধরণের যেমন পূরণ করতে পারেন float,str ইত্যাদি।

বিশেষত, আমি একই কলামের বিভিন্ন মানের তুলনা করতে ডেটাটাইপ বিবেচনা করব।


2

পান্ডে না মানগুলি প্রতিস্থাপন করতে

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

যদি inplace = False, ডিএফ (ডেটাফ্রেম) আপডেট করার পরিবর্তে এটি পরিবর্তিত মানগুলি ফিরিয়ে দেয়।


1

আপনি যদি এটি কোনও পান্ডাস ডেটা ফ্রেমে রূপান্তর করতে চান তবে আপনি এটি ব্যবহার করে এটিও সম্পন্ন করতে পারেন 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

1

প্রাথমিকভাবে দুটি বিকল্প উপলব্ধ; অনুমানযোগ্য বা অনুপস্থিত মান পূরণ করার ক্ষেত্রে কেবলমাত্র সংখ্যার প্রতিস্থাপনের সাথে NaN / np.nan (কলাম (গুলি) জুড়ে:

df['Amount'].fillna(value=None, method= ,axis=1,) পর্যাপ্ত:

ডকুমেন্টেশন থেকে:

মান: স্কেলার, ডিক, সিরিজ বা ডেটাফ্রেম মানটি গর্তগুলি পূরণ করার জন্য (উদাহরণস্বরূপ 0), পর্যায়ক্রমে প্রতিটি সূচক (একটি সিরিজের জন্য) বা কলামের জন্য (কোনও ডাটাফ্রেমের জন্য) মানটি নির্দিষ্ট করে এমন মানগুলির একটি ডিক / সিরিজ / ডেটা ফ্রেম নির্দিষ্ট করে fill । (ডিক্ট / সিরিজ / ডেটা ফ্রেমের মান পূরণ করা হবে না)। এই মানটি কোনও তালিকা হতে পারে না।

যার অর্থ 'স্ট্রিংস' বা 'ধ্রুবকগুলি' আর অঙ্কিত হওয়ার অনুমতি নেই।

আরও বিশেষায়িত অভিব্যক্তির জন্য সিম্পল কম্পিউটার () ব্যবহার করুন :

from sklearn.impute import SimpleImputer
si = SimpleImputer(strategy='constant', missing_values=np.nan, fill_value='Replacement_Value')
df[['Col-1', 'Col-2']] = si.fit_transform(X=df[['C-1', 'C-2']])

0

বিভিন্ন কলামে নানকে বিভিন্ন উপায়ে প্রতিস্থাপন করতে:

   replacement= {'column_A': 0, 'column_B': -999, 'column_C': -99999}
   df.fillna(value=replacement)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.