অনুপস্থিত মানগুলি সাধারণ এবং হয় মানুষের ত্রুটি, যন্ত্র ত্রুটি, অন্য দল থেকে প্রক্রিয়াকরণ, বা অন্যথায় একটি নির্দিষ্ট পর্যবেক্ষণের জন্য ডেটার অভাবের কারণে ঘটে।
এই বাইটে, আমরা দেখে নেব কিভাবে A-তে NaN পূরণ করতে হয়
DataFrame
, যদি আপনি সেগুলি পূরণ করে NaN পরিচালনা করতে চান।
প্রথম বন্ধ, আসুন একটি উপহাস তৈরি করা যাক DataFrame
কিছু র্যান্ডম মান বাদ দিয়ে:
import numpy as np
array = np.random.randn(25, 3)
mask = np.random.choice([1, 0], array.shape, p=[.3, .7]).astype(bool)
array[mask] = np.nan
df = pd.DataFrame(array, columns=['Col1', 'Col2', 'Col3'])
Col1 Col2 Col3
0 -0.671603 -0.792415 0.783922
1 0.207720 NaN 0.996131
2 -0.892115 -1.282333 NaN
3 -0.315598 -2.371529 -1.959646
4 NaN NaN -0.584636
5 0.314736 -0.692732 -0.303951
6 0.355121 NaN NaN
7 NaN -1.900148 1.230828
8 -1.795468 0.490953 NaN
9 -0.678491 -0.087815 NaN
10 0.755714 0.550589 -0.702019
11 0.951908 -0.529933 0.344544
12 NaN 0.075340 -0.187669
13 NaN 0.314342 -0.936066
14 NaN 1.293355 0.098964
আসুন প্লট করি, বলুন, তৃতীয় কলাম:
plt.plot(df['Col3'])
যখন বিভিন্ন কৌশল দ্বারা পূর্ণ হয় - এই NaN-ভরা গ্রাফটি এর সাথে প্রতিস্থাপন করা যেতে পারে:
fillna() - গড়, মধ্যমা, মোড
আপনি এই মানগুলিকে একটি নতুন কলামে পূরণ করতে পারেন এবং আপনি যে কলামটি পূরণ করতে চান তাতে এটি বরাদ্দ করতে পারেন, অথবা ব্যবহার করে ইন-প্লেস করতে পারেন inplace
যুক্তি. এখানে, আমরা পরিদর্শনের সুবিধার জন্য একটি নতুন কলামে ভরা মানগুলি বের করব:
mean = df['Col3'].fillna(df['Col3'].mean(), inplace=False)
median = df['Col3'].fillna(df['Col3'].median(), inplace=False)
mode = df['Col3'].fillna(df['Col3'].mode(), inplace=False)
কলামের মধ্যক, গড় এবং মোড হল -0.187669
, -0.110873
এবং 0.000000
এবং এই মানগুলি যথাক্রমে প্রতিটি NaN-এর জন্য ব্যবহার করা হবে। এটি কার্যকরভাবে ধ্রুবক মান দিয়ে পূরণ করছে, যেখানে মান ইনপুট হচ্ছে কলামের প্রবেশের উপর নির্ভর করে।
প্রথমত, মধ্যম মান দিয়ে পূরণ করার ফলে:
গড় মান সহ:
মোড মান সহ:
fillna() - ধ্রুবক মান
আপনি পরিবর্তে একটি ধ্রুবক মান দিয়ে পূরণ করতে পারেন:
সেরা-অভ্যাস, শিল্প-স্বীকৃত মান এবং অন্তর্ভুক্ত চিট শীট সহ গিট শেখার জন্য আমাদের হ্যান্ডস-অন, ব্যবহারিক গাইড দেখুন। গুগলিং গিট কমান্ড এবং আসলে বন্ধ করুন শেখা এটা!
constant = df['Col3'].fillna(0, inplace=False
এর ফলে প্রতিটি NaN এর পরিবর্তে একটি ধ্রুবক মান (0) রাখা হয়। 0
আমাদের মধ্যকার কাছাকাছি এবং গড় এবং মোডের সমান, তাই ভরাট মানগুলি আমাদের উপহাস ডেটাসেটের জন্য সেই পদ্ধতির সাথে সাদৃশ্যপূর্ণ হবে:
0 0.783922
1 0.996131
2 0.000000
3 -1.959646
4 -0.584636
5 -0.303951
6 0.000000
7 1.230828
8 0.000000
9 0.000000
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
fillna() - ফরোয়ার্ড এবং ব্যাকওয়ার্ড ফিল
প্রতিটি সারিতে - আপনি আগে বা পরে সারি থেকে মান গ্রহণ করে একটি ফরোয়ার্ড বা পিছন দিকে ফিল করতে পারেন:
ffill = df['Col3'].fillna(method='ffill')
bfill = df['Col3'].fillna(method='bfill')
ফরওয়ার্ড-ফিলিংয়ের সাথে, যেহেতু আমরা সারি 2 থেকে অনুপস্থিত - দ্বিতীয়টি পূরণ করতে সারি 1 থেকে মান নেওয়া হয়। মানগুলি এগিয়ে যায়:
0 0.783922
1 0.996131
2 0.996131
3 -1.959646
4 -0.584636
5 -0.303951
6 -0.303951
7 1.230828
8 1.230828
9 1.230828
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
ব্যাকওয়ার্ড-ফিলিং সঙ্গে, বিপরীত ঘটবে. সারি 2 সারি 3 থেকে মান দিয়ে পূর্ণ হয়:
0 0.783922
1 0.996131
2 -1.959646
3 -1.959646
4 -0.584636
5 -0.303951
6 1.230828
7 1.230828
8 -0.702019
9 -0.702019
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
যদিও, যদি একাধিক থাকে NaN
একটি ক্রমানুসারে - এগুলি ভাল কাজ করবে না এবং NaN কে আরও নীচে ক্যাসকেড করতে পারে, ডেটা স্কুইং করে এবং প্রকৃতপক্ষে রেকর্ড করা মানগুলি সরিয়ে দেয়।
ইন্টারপোলেট()
সার্জারির interpolate()
পদ্ধতি SciPy-এর কাছে মানগুলির ইন্টারপোলেশন অর্পণ করে মান ইন্টারপোলেট করার জন্য পদ্ধতির স্যুট. এটি বিভিন্ন ধরনের যুক্তি গ্রহণ করে, যার মধ্যে রয়েছে, nearest
, zero
, slinear
, quadratic
, cubic
, spline
, barycentric
, polynomial
, krogh
, piecewise_polynomial
, spline
, pchip
, akima
, cubicspline
ইত্যাদি
পূর্ববর্তী পদ্ধতির মতো ধ্রুবক বা অর্ধ-ভেরিয়েবল দিয়ে মান পূরণ করার চেয়ে ইন্টারপোলেশন অনেক বেশি নমনীয় এবং "স্মার্ট"।
ইন্টারপোলেশন সঠিকভাবে একটি ক্রম এমনভাবে পূরণ করতে পারে যা অন্য কোনও পদ্ধতি করতে পারে না, যেমন:
s = pd.Series([0, 1, np.nan, np.nan, np.nan, 5])
s.fillna(s.mean()).values
s.fillna(method='ffill').values
s.interpolate().values
ডিফল্ট ইন্টারপোলেশন রৈখিক, এবং যে অনুমান করা হয় 1...5
সম্ভবত একটি 1, 2, 3, 4, 5
সিকোয়েন্স খুব বেশি পাওয়া যায় না (কিন্তু নিশ্চিত নয়)। ধ্রুবক ভরাট এবং ফরোয়ার্ড বা ব্যাকওয়ার্ড-ফিলিং উভয়ই এখানে খারাপভাবে ব্যর্থ হয়। সাধারণভাবে বলতে গেলে - কোলাহলপূর্ণ সংকেত বা দূষিত ডেটাসেটে NaN পূরণ করার ক্ষেত্রে ইন্টারপোলেশন সাধারণত একটি ভাল বন্ধু হতে চলেছে।
ইন্টারপোলেশনের ধরন নিয়ে পরীক্ষা করলে ভালো ফলাফল পাওয়া যেতে পারে।
এখানে দুটি ইন্টারপোলেশন পদ্ধতি রয়েছে (splice
এবং polynomial
প্রয়োজন একটি order
যুক্তি):
nearest = df['Col3'].interpolate(method='nearest')
polynomial = df['Col3'].interpolate(method='polynomial', order=3)
এর ফলে:
এবং: