প্যানডাস ডেটাফ্রেমে পূর্বের মানগুলি দিয়ে NaN গুলি কীভাবে প্রতিস্থাপন করবেন?


140

ধরুন আমার কাছে কিছু NaNএস সহ একটি ডেটা ফ্রেম রয়েছে :

>>> import pandas as pd
>>> df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])
>>> df
    0   1   2
0   1   2   3
1   4 NaN NaN
2 NaN NaN   9

আমাকে যা করতে হবে তা হ'ল প্রতিটির উপরে একই কলামে NaNপ্রথম অ- NaNমান সহ প্রতিস্থাপন । ধারণা করা হয় যে প্রথম সারিতে কখনই a থাকবে না NaN। পূর্ববর্তী উদাহরণের জন্য ফলাফল হবে

   0  1  2
0  1  2  3
1  4  2  3
2  4  2  9

আমি পুরো ডেটাফ্রেম কলাম-বাই কলাম, উপাদান-দ্বারা-উপাদান-এর মাধ্যমে লুপ করতে পারি এবং মানগুলি সরাসরি সেট করতে পারি, তবে এটি অর্জনের কোনও সহজ (অনুকূলভাবে লুপ-ফ্রি) উপায় কি আছে?

উত্তর:


213

আপনি fillnaডেটাফ্রেমে পদ্ধতিটি ব্যবহার করতে পারেন এবং পদ্ধতিটি ffill(ফরোয়ার্ড ফিল) হিসাবে নির্দিষ্ট করতে পারেন:

>>> df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])
>>> df.fillna(method='ffill')
   0  1  2
0  1  2  3
1  4  2  3
2  4  2  9

এই পদ্ধতি ...

শেষ বৈধ পর্যবেক্ষণ প্রচার করুন [গুলি] পরবর্তী বৈধের দিকে এগিয়ে

বিপরীতে যেতে, একটি bfillপদ্ধতিও রয়েছে।

এই পদ্ধতিটি ডেটা ফ্রেমের অভ্যন্তরীণ পরিবর্তন করে না - আপনাকে ফিরিয়ে নেওয়া ডেটাফ্রেমটি একটি ভেরিয়েবলের কাছে ফেরত দিতে হবে বা অন্যটি উল্লেখ করতে হবে inplace=True:

df.fillna(method='ffill', inplace=True)

31

গৃহীত উত্তরটি নিখুঁত। আমার একটি সম্পর্কিত তবে কিছুটা আলাদা পরিস্থিতি ছিল যেখানে আমাকে আগেই পূরণ করতে হয়েছিল তবে কেবলমাত্র গোষ্ঠীর মধ্যে। যদি কারও একই চাহিদা থাকে তবে জেনে রাখুন যে ফিলেনা একটি ডেটা ফ্রেমগ্রুপবাই অবজেক্টে কাজ করে।

>>> example = pd.DataFrame({'number':[0,1,2,nan,4,nan,6,7,8,9],'name':list('aaabbbcccc')})
>>> example
  name  number
0    a     0.0
1    a     1.0
2    a     2.0
3    b     NaN
4    b     4.0
5    b     NaN
6    c     6.0
7    c     7.0
8    c     8.0
9    c     9.0
>>> example.groupby('name')['number'].fillna(method='ffill') # fill in row 5 but not row 3
0    0.0
1    1.0
2    2.0
3    NaN
4    4.0
5    4.0
6    6.0
7    7.0
8    8.0
9    9.0
Name: number, dtype: float64

ঠিক আমি যা খুঁজছিলাম, ty
টনি

18

আপনি ব্যবহার করতে পারেন pandas.DataFrame.fillnaসঙ্গে method='ffill'বিকল্প। 'ffill''ফরওয়ার্ড ফিল' এর অর্থ দাঁড়ায় এবং শেষ বৈধ পর্যবেক্ষণকে এগিয়ে প্রচার করে। বিকল্পটি 'bfill'একইভাবে কাজ করে তবে পিছন দিকে।

import pandas as pd

df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])
df = df.fillna(method='ffill')

print(df)
#   0  1  2
#0  1  2  3
#1  4  2  3
#2  4  2  9

pandas.DataFrame.ffillবিষয়গুলি সহজ করে তোলার জন্য এটির প্রত্যক্ষ প্রতিশব্দ ফাংশনও রয়েছে ।


14

এই সমাধানটি চেষ্টা করার সময় আমি একটি জিনিস লক্ষ্য করেছি যে হ'ল আপনার যদি শুরুতে বা অ্যারের শেষে এন / এ থাকে তবে ফিলফিল এবং বিফিল বেশ কার্যকর হয় না। আপনার দুজনেরই দরকার।

In [224]: df = pd.DataFrame([None, 1, 2, 3, None, 4, 5, 6, None])

In [225]: df.ffill()
Out[225]:
     0
0  NaN
1  1.0
...
7  6.0
8  6.0

In [226]: df.bfill()
Out[226]:
     0
0  1.0
1  1.0
...
7  6.0
8  NaN

In [227]: df.bfill().ffill()
Out[227]:
     0
0  1.0
1  1.0
...
7  6.0
8  6.0

উজ্জ্বল। আমার সমস্যার জন্য আমার ঠিক এটি দরকার ছিল। আগে এবং পরে উভয়ই পূরণ করা। অনেক ধন্যবাদ.
প্রমিথিউস

গ্রেট। আমার এই সমাধান দরকার ধন্যবাদ
জুনক্রাট


5

শুধুমাত্র একটি কলাম সংস্করণ

  • সর্বশেষ বৈধ মান সহ এনএএন পূরণ করুন
df[column_name].fillna(method='ffill', inplace=True)
  • পরবর্তী বৈধ মান সহ এনএএন পূরণ করুন
df[column_name].fillna(method='backfill', inplace=True)

5

কেবল ffillপদ্ধতির সাথে একমত , তবে একটি অতিরিক্ত তথ্য হ'ল আপনি কীওয়ার্ড আর্গুমেন্টের সাহায্যে ফরওয়ার্ড পূরণকে সীমাবদ্ধ করতে পারেন limit

>>> import pandas as pd    
>>> df = pd.DataFrame([[1, 2, 3], [None, None, 6], [None, None, 9]])

>>> df
     0    1   2
0  1.0  2.0   3
1  NaN  NaN   6
2  NaN  NaN   9

>>> df[1].fillna(method='ffill', inplace=True)
>>> df
     0    1    2
0  1.0  2.0    3
1  NaN  2.0    6
2  NaN  2.0    9

এখন limitকীওয়ার্ড যুক্তি দিয়ে with

>>> df[0].fillna(method='ffill', limit=1, inplace=True)

>>> df
     0    1  2
0  1.0  2.0  3
1  1.0  2.0  6
2  NaN  2.0  9

1

আমার ক্ষেত্রে, আমাদের বিভিন্ন ডিভাইস থেকে সময় সিরিজ রয়েছে তবে কিছু ডিভাইস কিছু সময়ের জন্য কোনও মান প্রেরণ করতে পারেনি। সুতরাং আমাদের প্রতিটি ডিভাইস এবং সময় সময়কালের জন্য এনএ মান তৈরি করা উচিত এবং তারপরে ফিলেনা করা উচিত।

df = pd.DataFrame([["device1", 1, 'first val of device1'], ["device2", 2, 'first val of device2'], ["device3", 3, 'first val of device3']])
df.pivot(index=1, columns=0, values=2).fillna(method='ffill').unstack().reset_index(name='value')

ফলাফল:

        0   1   value
0   device1     1   first val of device1
1   device1     2   first val of device1
2   device1     3   first val of device1
3   device2     1   None
4   device2     2   first val of device2
5   device2     3   first val of device2
6   device3     1   None
7   device3     2   None
8   device3     3   first val of device3

0

আপনি fillnaNaN মানগুলি অপসারণ বা প্রতিস্থাপন করতে ব্যবহার করতে পারেন।

NaN সরান

import pandas as pd

df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])

df.fillna(method='ffill')
     0    1    2
0  1.0  2.0  3.0
1  4.0  2.0  3.0
2  4.0  2.0  9.0

NaN প্রতিস্থাপন

df.fillna(0) # 0 means What Value you want to replace 
     0    1    2
0  1.0  2.0  3.0
1  4.0  0.0  0.0
2  0.0  0.0  9.0

রেফারেন্স পান্ডাস.ডাটাফ্রেম.ফিলনা

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.