💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱۶ دیدگاه نظر المیرا ناصح
آموزش کتابخانه Pandas (پانداس)
آموزش کتابخانه Pandas (پانداس)

Pandas از کتابخانه‌های متن بازی است که برای کار با داده‌هایی با ساختار رابطه‌ای (rational) یا برچسب‌گذاری شده ایجاد شده‌ است. این کتابخانه ساختار داده‌های متنوعی به همراه امکان اعمال عملیات عددی روی این داده‌ها را فراهم می‌کند وبه خوبی می‌تواند با سری‌های زمانی کار کند. Pandas بر مبنای کتابخانه‌ی NumPy ساخته شده ‌است و بسیاری از ساختار‌های NumPy در این کتابخانه استفاده شده و گسترش یافته‌اند. در ادامه به آموزش کتابخانه Pandas می‌پردازیم. مزایای این کتابخانه شامل موارد زیر است:

  • سرعت و کارایی بالا در کار با داده‌ها.
  • امکان بارگذاری داده‌ها از فایل‌های متفاوت.
  • کنترل راحت ویژگی‌هایی که مقداردهی نشده‌اند. (به عبارتی این مقادیر با NaN مقداردهی شده‌اند.)
  • قابلیت تغییر اندازه: ستون‌هایی می‌توانند به داده‌ها اضافه شوند و یا از آن‌ها حذف شوند.
  • ادغام (merge) و اتصال (join) مجموعه داده ها.
  • تغییر شکل داده به طور منعطف.
  • فراهم کردن امکان کار با سری‌های زمانی.
  • امکان گروه‌بندی داده‌ها با توجه به اهداف کاربردی.

محیطی که در این مقاله برای کار انتخاب کرده‌ایم JuputerNotebook است که از توزیع آناکوندا استفاده شده ‌است. برای توضیحات بیشتر و نحوه‌ی نصب آن به این مقاله مراجعه کنید.

ساختار داده‌ها در کتابخانه Pandas

به طور کلی کتابخانه Pandas  دارای دو دسته ساختار داده است:

  • سری یا Series
  • دیتافریم یا DataFrame

البته نوع سومی تحت عنوان Panel هم بود که در نسخه‌های جدید منسوخ شده ‌است.

نوع داده‌ی Series

سری یک آرایه‌ی یک بُعدی و برچسب‌گذاری شده ‌است (دارای ایندکس برای سطرهاست) که می‌تواند انواع مختلف داده (عدد صحیح، اعشاری، رشته، آبجکت‌های پایتون و...) را در خود نگه دارد.

به محور برچسب‌ها اندیس یا index می‌گویند. سری‌های کتابخانه Pandas مثل یک ستون از صفحه‌ی اکسل است. اندیس‌ها باید منحصر به فرد باشند و هر اندیس فقط به یک عنصر اشاره کند. منبع داده برای سری‌های کتابخانه Pandas می‌تواند پایگاه داده‌ی SQL، فایل‌های CSV و اکسل باشد. نوع داده‌ی ورودی سری نیز می‌تواند به شکل لیست، تاپل و دیکشنری و عدد اسکالر باشد.

ایجاد یک سری: یک سری در پانداس به شکل زیر تعریف می‌شود:

pandas.Series( data, index, dtype, copy)

که در آن:

  • data: داده‌ی ورودی است که می‌تواند به شکل آرایه، لیست، دیکشنری یا عدد باشد.
  • index: مقدار اندیس یا برچسب اختصاصی به هر سطر است که به طور پیش‌فرض از اعداد 0 تا n-1 است(n: تعداد داده‌هاست) و البته می‌تواند هر مقدار عددی یا رشته‌ای دلخواه را بگیرد.
  • dtype: نوع داده‌ی اختصاصی به ستون داده است که اگر مقدار ندهیم، خودش از داده‌ها  نوع‌شان را استنباط می‌کند.
  • copy: کپی از سری ایجاد می‌کند و مقدار پیش‌فرض False دارد.

در مثال زیر نحوه‌ی ایجاد یک سری با استفاده از آرایه را می‌بینیم.

import pandas as pd  
import numpy as np 
# Creating empty series  
ser = pd.Series()  
print(ser)  
# simple array  
data = np.array(['g', 'e', 'e', 'k', 's'])  
ser = pd.Series(data)  
print(ser) 
Series([], dtype: float64) 0    g 1    e 2    e 3    k 4    s dtype: object

اگر مقدار ستون اندیس را مقداردهی نکنیم مانند مثال بالا به طور پیش‌فرض از صفر شروع به مقداردهی اندیس‌ها می‌کند. می‌توانیم ستون اندیس‌ها را  با عبارت  index=[ ]نام‌گذاری کنیم:

pd.Series([1., 2., 3.], index=['a', 'b', 'c'])
a 1.0 b 2.0 c 3.0 dtype: float64

برای مشاهده‌ی داده‌های یک سری از دستور values استفاده می‌کنیم و با index اندیس‌ها را استخراج می‌کنیم:

my_series=pd.Series([1., 2., 3.], index=['a', 'b', 'c'])
print(my_series.values)
print(my_series.index)
[1. 2. 3.] Index(['a', 'b', 'c'], dtype='object')

داده‌ی ورودی یک سری می‌تواند به شکل دیکشنری نیز باشد. کلید‌های دیکشنری به طور پیش‌فرض در نقش ستون اندیس‌ها ظاهر می‌شوند و اگر مقدار index به عنوان ورودی به کد داده شود، داده‌های دیکشنری در مقابل اندیس‌هایی ظاهر می‌شوند که آن اندیس با مقدار کلید داده در دیکشنری برابر باشد.

import pandas as pd
import numpy as np
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data)
print (s)

سری خروجی به شکل زیر است:

a 0.0 b 1.0 c 2.0 dtype: float64

می‌توانیم ستون اندیس را خودمان مقدار دهی کنیم:

import pandas as pd
import numpy as np
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data,index=['b','c','d','a'])
print (s)
b 1.0 c 2.0 d NaN a 0.0 dtype: float64

نکته: اگر داده به صورت دیکشنری باشد و اندیس سری را خودمان تعریف کنیم، آن اندیسی که در داخل کلیدهای دیکشنری نباشد مقدار NAN می‌گیرد. (مثل اندیس d در مثال بالا)

انتخاب و دستیابی به عناصر سری با مکان داده

می‌توان به عناصر با شماره‌ی اندیس آن‌ها و یا نام اندیس آن‌ها در داخل براکت [ ] دسترسی داشت. در مثال زیر پنج عنصر اول را انتخاب می‌کنیم.

# import pandas and numpy 
import pandas as pd
import numpy as np
# creating simple array
data = np.array(['g','e','e','k','s','f', 'o','r','g','e','e','k','s'])
ser = pd.Series(data)
#retrieve the first element
print(ser[:5])
0    g
1    e
2    e
3    k
4    s
dtype: object

در مثال زیر هم به کمک برچسب اندیس به داده دسترسی داریم:

# import pandas and numpy 
import pandas as pd
import numpy as np
# creating simple array
data = np.array(['g','e','e','k','s','f', 'o','r','g','e','e','k','s'])
ser = pd.Series(data,index=[10,11,12,13,14,15,16,17,18,19,20,21,22])
# accessing a element using index element
print(ser[16])

o

اندیس‌دهی به داده می‌تواند به معنای انتخاب زیرمجموعه‌ای از داده باشد. در مثال زیر ستونی با نام Name از یک فایل csv را انتخاب می‌کنیم و با تابع( head(10 به ده عنصر ابتدایی سری، دست می‌یابیم:

# importing pandas module  
import pandas as pd  
# making data frame  
df = pd.read_csv("nba.csv")  
ser = pd.Series(df['Name']) 
data = ser.head(10)
data 

برای دستیابی به عناصر با اندیس 3 و 4 و 5 دستور زیر را می‌نویسیم:

# using indexing operator
data[3:6]

انتخاب عناصر سری با دستور loc

می‌توان عدد یا برچسب اندیس‌های مورد نظر را داخل براکت مقابل [loc[a:b قرار داد. توجه کنید که در اندیس‌دهی با loc، عدد آخر یعنی b  درنظر گرفته می‌شود. به این مثال توجه کنید:

data.loc[3:6]

انتخاب عناصر سری با دستور iloc

دستور iloc مشابه loc است با این تفاوت که در [iloc[a:b اندیس‌ها فقط باید عددی باشند و داده‌ی مربوط به اندیس عدد b نیز جزو عناصر انتخابی نخواهد بود، همان‌طور که در کد زیر مشاهده می‌کنید، عنصر با اندیس 6 جزو خروجی نیست:

# using .iloc[] function
data.iloc[3:6]

اجرای عملیات باینری روی سری‌ها

عملیات باینری مثل جمع و تفریق و ... را می‌توان روی سری‌ها انجام داد:

# importing pandas module  
import pandas as pd  
# creating a series
data = pd.Series([5, 2, 3,7], index=['a', 'b', 'c', 'd'])
print(data)
# creating a series
data1 = pd.Series([1, 6, 4, 9], index=['a', 'b', 'd', 'e'])
print(data1)

دو سری data و data1 را داریم:

a    5
b    2
c    3
d    7
dtype: int64
a    1
b    6
d    4
e    9
dtype: int64

حال برای جمع data و data1 از دستور add استفاده می‌کنیم:

data.add(data1, fill_value=0)
a     6.0
b     8.0
c     3.0
d    11.0
e     9.0
dtype: float64

سایر عملیات دودویی مثل .sub، .mul، .div،.pow و.... نیز وحود دارد که برای مطالعه‌ی بیشتر می‌توانید به داکیومنت کتابخانه Pandas مراجعه کنید.

دیتافریم (Dataframe) در کتابخانه Pandas

دیتافریم (Dataframe) یک ساختار داده‌ی دو بعُدی است و داده‌ها شامل سطر(یا همان index) و ستون (یا همان columns) است و ساختاری رابطه‌ای است و هر تعداد داده می‌توانیم در آن ذخیره کنیم و انواع عملیات محاسباتی و رابطه‌ای را همچون انتخاب، اتصال و گروه‌بندی را روی آن انجام دهیم.

 

dataframe در pandas

یک دیتافریم (Dataframe) در کتابخانه Pandas (پانداس) به شکل زیر تعریف می‌شود:

pandas.DataFrame( data, index, columns, dtype, copy)

که در آن:

  • data: داده‌ی ورودی است که می‌تواند لیست، آرایه، مقدار ثابت، دیکشنری و یا یک دیتافریم (Dataframe) باشد.
  • index: برای برچسب‌دهی به سطرها استفاده می‌شود و اگر مقداری برایش تعریف نشود به طور خودکار از عدد 0 تا n-1 را که n تعداد داده‌هاست را، می‌گیرد.
  • columns: برای برچسب‌دهی به ستون‌ها استفاده می‌شود و اگر مقداری برایش تعریف نشود به طور خودکار از عدد 0 تا n-1 را که n تعداد ویژگی یا ستون‌هاست را، می‌گیرد.
  • dtype: نوع ستون‌ها را برمی‌گرداند.
  • copy: اگر مقدارش True باشد از داده‌ها کپی ایجاد می‌کند، اما مقدار پیش‌فرض آن False است.

دیتافریم (Dataframe) در کتابخانه Pandas (پانداس)، به چند شکل مختلف می‌تواند ایجاد شود: 1.ایجاد دیتافریم (Dataframe) خالی یک دیتافریم (Dataframe) اولیه می‌تواند شامل هیچ مقداری نباشد و تنها با متد DataFrame آن را ایجاد کنیم:

# import pandas as pd 
import pandas as pd 
# Calling DataFrame constructor 
df = pd.DataFrame() 
print(df)
Empty DataFrame Columns: [] Index: []

2. ایجاد دیتافریم (Dataframe) با لیست داده‌ی دیتافریم (Dataframe) می‌تواند یک لیست یا لیست‌های تودرتو باشد:

# import pandas as pd 
import pandas as pd 
# list of strings 
lst = ['this', 'is', 'a', 'practial', 
			'article', 'for', 'Pandas'] 
# Calling DataFrame constructor on list 
df = pd.DataFrame(lst) 
print(df)

 

          0
0      this
1        is
2         a
3  practial
4   article
5       for
6    Pandas

نکته: پیش از ادامه‌ی بقیه‌ی مطالب، یادآور می‌شویم که در دیتافریم (Dataframe) هم مانند سری‌ها می‌توان ویژگی مرتبط با سطرها و ستون‌ها را مقداردهی کرد.(مقادیر عددی یا رشته‌ای به index و columns داد.) اما اگر مقداردهی نکنیم به طور پیش‌فرض عددی و با شروع از صفر مقداردهی می‌شوند ((numpy.arrange(n :از 0 تا n-1). مثال زیر را ببینید:

# import pandas as pd 
import pandas as pd 
# list of strings 
lst = ['this', 'is', 'a', 'practical', 
			'article', 'for', 'Pandas'] 
# Calling DataFrame constructor on list 
df = pd.DataFrame(lst, index=['row1','row2','row3','row4','row5','row6','row7'], columns=['col1']) 
print(df)
           col1
row1       this
row2         is
row3          a
row4  practical
row5    article
row6        for
row7     Pandas

3- ایجاد دیتافریم (Dataframe) با دیکشنری

برای اینکه بتوانیم یک دیتافریم (Dataframe) با داده‌ای از  جنس دیکشنری‌ ایجاد کنیم که مقدار اختصاصی به هر کلید از نوع آرایه یا لیست است، باید طول این لیست یا آرایه‌ها با هم برابر باشند. (اگر index را خودمان مقداردهی کنیم این مقدار باید برابر طول آرایه یا لیست باشد.). کلیدهای دیکشنری برای ستون‌های دیتافریم (Dataframe) در نظر گرفته می‌شوند.

# Python code demonstrate creating  
# DataFrame from dict narray / lists  
# By default addresses. 
import pandas as pd 
# intialise data of lists. 
data = {'Name':['Tom', 'nick', 'krish', 'jack'], 'Age':[20, 21, 19, 18]} 
# Create DataFrame 
df = pd.DataFrame(data) 
# Print the output. 
print(df) 

خروجی این کد دیتافریمی (Dataframe) به شکل زیر است:

    Name  Age
0    Tom   20
1   nick   21
2  krish   19
3   jack   18

کار با سطرها و ستون‌ها در دیتافریم (Dataframe)

می‌توان بر روی دیتافریم (Dataframe)‌ها عملیاتی چون انتخاب، حذف، افزودن و تغییر نام سطرها و ستون‌ها را انجام داد.

انتخاب ستون‌ها: برای انتخاب ستون‌ها می‌توان از نام آن‌ها استفاده کرد. در کد زیر دیتافریمی (Dataframe) با نام df ایجاد می‌کنیم و سپس ستون‌های Name و Qualification را انتخاب می‌کنیم.

# Import pandas package
import pandas as pd
# Define a dictionary containing employee data
data = {'Name':['Jai', 'Princi', 'Gaurav', 'Anuj'],
        'Age':[27, 24, 22, 32],
        'Address':['Delhi', 'Kanpur', 'Allahabad', 'Kannauj'],
        'Qualification':['Msc', 'MA', 'MCA', 'Phd']}
# Convert the dictionary into DataFrame 
df = pd.DataFrame(data)
# select two columns
print(df[['Name', 'Qualification']])
     Name Qualification
0     Jai           Msc
1  Princi            MA
2  Gaurav           MCA
3    Anuj           Phd

انتخاب سطرها: سطرهای مورد نظر را می‌توان با دستور loc یا iloc  یا ix انتخاب کرد و البته همان‌طور که در قسمت Series گفته‌ شد برای انتخاب سطر با iloc تنها از شماره‌ی برچسب اندیس می‌توان استفاده کرد. داده‌های زیر را در نظر بگیرید:

# Import pandas package
import pandas as pd
# Define a dictionary containing employee data
data = {'Name':['Jai', 'Princi', 'Gaurav', 'Anuj'],
        'Age':[27, 24, 22, 32],
        'Address':['Delhi', 'Kanpur', 'Allahabad', 'Kannauj'],
        'Qualification':['Msc', 'MA', 'MCA', 'Phd']}
# Convert the dictionary into DataFrame 
df = pd.DataFrame(data,index=('Person1','Person2','Person3','Person4'))
df

دیتافریم (Dataframe) ما در این کد به شکل زیر است:

 NameAgeAddressQualification
Person1Jai27DelhiMsc
Person2Princi24KanpurMA
Person3Gaurav22AllahabadMCA
Person4Anuj32KannaujPhd

حال اگر بخواهیم سطر اول را انتخاب کنیم، با یکی از دو دستور زیر این کار را می‌توانیم انجام دهیم:

#with loc
df.loc[['Person1']]
#with iloc
df.iloc[[0]]

که خروجی هر دو کد یکسان است:

 NameAgeAddressQualification
Person1Jai27DelhiMsc

نکته:

  1. یادآوری می‌کنیم که iloc تنها با اندیس‌های عددی کار می‌کند و متد loc با اندیس تعریف شده در جدول.

  2. به دو جفت براکت کنار هر متد دقت کنید: اگر تنها یک جفت براکت بگذاریم خروجی به شکل ستونی زیر چاپ می‌شود:

Name               Jai Age                 27 Address          Delhi Qualification      Msc Name: Person1, dtype: object

اگر بخواهیم دو سطر اول و دوم را انتخاب کنیم مانند کد زیر عمل می‌کنیم:

#with loc
df.loc['Person1':'Person2']
#or
df.loc[['Person1','Person2']]
#with iloc
df.iloc[0:2]
 NameAgeAddressQualification
Person1Jai27DelhiMsc
Person2Princi24KanpurMA

و برای انتخاب سطر اول و اول و ستون دوم و سوم:

#with loc
df.loc['Person1':'Person2','Age':'Address']
#or
df.loc[['Person1','Person2'],['Age','Address']]
#with iloc
df.iloc[0:2,1:3]
 AgeAddress
Person127Delhi
Person224Kanpur

 

نکته: اگر ایندکس‌ سطرها به صورت عددی بود، loc را مانند iloc می‌نویسیم با این تفاوت که در loc عدد اندیس آخر را درنظر می‌گیریم. یعنی مثلاً برای انتخاب سطر اول و دوم  دستور را به صورت [loc[0:1 می‌نویسیم، درحالی که برای iloc به شکل [0:2]iloc است.

دسترسی به دیتافریم (Dataframe) با اندیس‌دهی بولین

برای دسترسی به دیتافریم (Dataframe) با اندیس بولین، باید دیتافریم‌ها (Dataframe) را با اندیس بولین ایجاد کنیم. یعنی دیتافریمی (Dataframe) با اندیس‌هایی که مقادیر آن True یا False باشد. به طور مثال:

# importing pandas as pd 
import pandas as pd 
# dictionary of lists 
dict = {'name':["aparna", "pankaj", "sudhir", "Geeku"], 
        'degree': ["MBA", "BCA", "M.Tech", "MBA"], 
        'score':[90, 40, 80, 98]} 
df = pd.DataFrame(dict, index = [True, False, True, False]) 
print(df) 

شکل این دیتافریم (Dataframe) به صورت زیر است:

         name  degree  score
True   aparna     MBA     90
False  pankaj     BCA     40
True   sudhir  M.Tech     80
False   Geeku     MBA     98

دسترسی به عناصر دیتافریم (Dataframe) با اندیس بولین همچون سایر دیتافریم‌ها (Dataframe)‌ به یکی از روش‌های loc و iloc است. برای دسترسی با loc مقدار True یا False را به عنوان پارامتر ورودی ارسال می‌کنیم.

# importing pandas as pd 
import pandas as pd 
# dictionary of lists 
dict = {'name':["aparna", "pankaj", "sudhir", "Geeku"], 
        'degree': ["MBA", "BCA", "M.Tech", "MBA"], 
        'score':[90, 40, 80, 98]} 
# creating a dataframe with boolean index  
df = pd.DataFrame(dict, index = [True, False, True, False]) 
# accessing a dataframe using .loc[] function  
print(df.loc[True])
        name  degree  score
True  aparna     MBA     90
True  sudhir  M.Tech     80

همان‌طور که قبلاً گفته شد، iloc تنها مقادیر عددی را به عنوان پارامتر ورودی می‌پذیرد، پس در نتیجه مقدار Boolean را نمی‌توان به آن داد.

دسترسی به عناصر دیتافریم (Dataframe) با اپراتورهای منطقی روی ستون‌ها وسطرها

می‌توان برای دسترسی به عناصر برمبنای مقادیرشان به کمک اپراتورهای منطقی همچون ==، <=، >= و != فیلترهایی تعریف کرد. خروجی چنین فیلترهایی مجموعه‌ای بولین با مقادیر  True و False است.


# importing pandas as pd 
import pandas as pd 
# dictionary of lists 
dict = {'name':["aparna", "pankaj", "sudhir", "Geeku"], 
        'degree': ["BCA", "BCA", "M.Tech", "BCA"], 
        'score':[90, 40, 80, 98]} 
# creating a dataframe  
df = pd.DataFrame(dict) 
# using a comparsion operator for filtering of data 
print(df['degree'] == 'BCA') 
0     True
1     True
2    False
3     True
Name: degree, dtype: bool

همین فیلترها را بر روی index یا همان برچسب سطرها نیز می‌توان اعمال کرد. مثال زیر را در نظر بگیرید:

# importing pandas as pd 
import pandas as pd 
# dictionary of lists 
dict = {'name':["aparna", "pankaj", "sudhir", "Geeku"], 
        'degree': ["BCA", "BCA", "M.Tech", "BCA"], 
        'score':[90, 40, 80, 98]} 
df = pd.DataFrame(dict, index = [0, 1, 2, 3])
print(df[df.index>=2])
     name  degree  score
2  sudhir  M.Tech     80
3   Geeku     BCA     98

مرتب‌سازی عناصر دیتافریم (Dataframe) در کتابخانه Pandas

برای مرتب‌سازی صعودی یا نزولی داده‌های ستون‌های دیتافریم (Dataframe) از تابع sort_values() استفاده می‌کنیم. قاعده‌ی کلی به شکل زیر است:

DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind=’quicksort’, na_position=’last’)

تمامی پارامترها به جز by دارای مقادیر پیش‌فرض‌اند.

by: نام یک یا مجموعه‌ای از ستون‌ها برای مرتب‌سازی داده‌ها بر مبنای آن ستون‌ها است.

axis: عدد 0 یا عبارت 'index' برای سطر  و 1 یا 'columns' برای ستون.

ascending: یک مقدار بولین که اگر True بود صعودی، و اگر False بود نزولی مرتب می‌کند.

inplace: یک مقدار بولین است. اگر True بود در دیتافریم (Dataframe) انتقالی به تابع، تغییراتی ایجاد می‌کند.

kind: یک مقدار رشته‌ای است که می‌تواند سه مقدار 'quicksort'، 'mergesort' و یا 'heapsort' را بگیرد و الگوریتم مرتب‌سازی بر اساس آن عمل کند.

na_position:  می‌تواند یکی از دو مقدار رشته‌ای 'last' یا 'first' را بگیرد و بر اساس آن تعیین کند که مکان مقادیر NAN یا همان تهی، پس از مرتب‌سازی در ابتدای جدول قرار گیرد یا در انتهای آن.

دیتافریم (Dataframe) برگشت داده شده از تابع مرتب‌سازی، همان ابعاد و shape دیتافریم (Dataframe) اولیه را دارد. فرض کنید دیتافریمی (Dataframe) با نام data به شکل زیر داریم و می‌خواهیم براساس ستون name سطرها را مرتب کنیم.

 nameAge
0John25
1Smith30
2Paul50
3Adam26
4Smith11

 

# importing pandas package 
import pandas as pd 
# sorting data frame by name 
data.sort_values("name", axis = 0, ascending = True, 
                 inplace = True, na_position ='last') 
# display 
data 
 nameAge
3Adam26
0John25
2Paul50
1Smith30
4Smith11

کار با مقادیر ناموجود یا تهی در دیتافریم (Dataframe)

داده‌ی ناموجود یا تهی (Missing Values) زمانی رخ می‌دهد که یک یا چند آیتم مقداردهی نشده باشند و یا اطلاعاتی در خصوص آن‌ها در دست نباشد. داده‌ی ناموجود در تحلیل داده‌های سناریوهای واقعی مسأله‌ی مهمی است. در پانداس از آن تحت عنوان NA  NotAvailible  نیز یاد می‌شود.

کنترل مقادیر ناموجود با is null و not null

برای کنترل مقادیر ناموجود در دیتافریم (Dataframe) کتابخانه pandas (پانداس) می‌توانیم از is null و not null استفاده کنیم. هردو تابع در کنترل اینکه آیا مقدار یک آیتم NAN هست یا نه؛ کمک می‌کنند. این توابع در سری‌ها هم می‌توانند برای یافتن مقادیر NAN به کار گرفته ‌شوند. خروجی این توابع مقادیر بولین است.

# importing pandas as pd
import pandas as pd
# importing numpy as np
import numpy as np
# dictionary of lists
dict = {'First Score':[100, 90, np.nan, 95],
        'Second Score': [30, 45, 56, np.nan],
        'Third Score':[np.nan, 40, 80, 98]}
# creating a dataframe from list
df = pd.DataFrame(dict)
# using isnull() function  
df.isnull()
 First ScoreSecond ScoreThird Score
0FalseFalseTrue
1FalseFalseFalse
2TrueFalseFalse
3FalseTrueFalse

مقداردهی مقادیر ناموجود با fillna، replace و interpolate

به منظور پرکردن و مقداردهی مقادیر تهی در دیتابیس از توابع fllna، replace و interpolate استفاده می‌کنیم که این توابع مقادیر NAN را با مقادیر تولیدی خود جایگزین می‌کنند. در کد زیر به کمک متد fillna مقادیر تهی را با صفر جایگزین می‌کنیم.

# importing pandas as pd
import pandas as pd
# importing numpy as np
import numpy as np
# dictionary of lists
dict = {'First Score':[100, 90, np.nan, 95],
        'Second Score': [30, 45, 56, np.nan],
        'Third Score':[np.nan, 40, 80, 98]}
# creating a dataframe from dictionary
df = pd.DataFrame(dict)
# filling missing value using fillna()  
df.fillna(0)
 First ScoreSecond ScoreThird Score
0100.030.00.0
190.045.040.0
20.056.080.0
395.00.098.0

حذف مقادیر null با تابع dropna

به منظور حذف مقادیر NAN از دیتافریم (Dataframe) از تابع dropna استفاده می‌کنیم. این تابع سطرها و ستون‌های NAN را با شیوه‌های مختلف حذف می‌کند. دیتافریم (Dataframe) df را به شکل زیر داریم:

# importing pandas as pd
import pandas as pd
# importing numpy as np
import numpy as np
# dictionary of lists
dict = {'First Score':[100, 90, np.nan, 95],
        'Second Score': [30, np.nan, 45, 56],
        'Third Score':[52, 40, 80, 98],
        'Fourth Score':[np.nan, np.nan, np.nan, 65]}
# creating a dataframe from dictionary
df = pd.DataFrame(dict)
df
 First ScoreSecond ScoreThird ScoreFourth Score
0100.030.052NaN
190.0NaN40NaN
2NaN45.080NaN
395.056.09865.0

در کد زیر سطرهایی که حداقل یک مقدار NAN دارند را حذف می‌کند.

# importing pandas as pd
import pandas as pd
# importing numpy as np
import numpy as np
# dictionary of lists
dict = {'First Score':[100, 90, np.nan, 95],
        'Second Score': [30, np.nan, 45, 56],
        'Third Score':[52, 40, 80, 98],
        'Fourth Score':[np.nan, np.nan, np.nan, 65]}
# creating a dataframe from dictionary
df = pd.DataFrame(dict)
# using dropna() function  
df.dropna()

خروجی به شکل زیر خواهد بود:

 First ScoreSecond ScoreThird ScoreFourth Score
395.056.09865.0

حال کدی می‌نویسیم که با آن سطری را که همه‌ی عناصر آن صفر باشد را حذف کنیم. فرض کنید دیتافریم (Dataframe) زیر را داریم که سطر دوم آن همگی NAN است:

# importing pandas as pd 
import pandas as pd 
# importing numpy as np 
import numpy as np 
# dictionary of lists 
dict = {'First Score':[100, np.nan, np.nan, 95], 
        'Second Score': [30, np.nan, 45, 56], 
        'Third Score':[52, np.nan, 80, 98], 
        'Fourth Score':[np.nan, np.nan, np.nan, 65]} 
df = pd.DataFrame(dict) 
# using dropna() function     
df.dropna(how = 'all')

خروجی حاصل به شکل زیر است:

First ScoreSecond ScoreThird ScoreFourth Score 
0100.030.052.0NaN
2NaN45.080.0NaN
395.056.098.065.0

حذف ستونی با حداقل یک مقدار null

مجموعه داده‌ی زیر را در نظر بگیرید:

# importing pandas as pd 
import pandas as pd 
# importing numpy as np 
import numpy as np 
# dictionary of lists 
dict = {'First Score':[100, np.nan, np.nan, 95], 
        'Second Score': [30, np.nan, 45, 56], 
        'Third Score':[52, np.nan, 80, 98], 
        'Fourth Score':[60, 67, 68, 65]} 
# creating a dataframe from dictionary  
df = pd.DataFrame(dict) 
df
 First ScoreSecond ScoreThird ScoreFourth Score
0100.030.052.060
1NaNNaNNaN67
2NaN45.080.068
395.056.098.065

دستور( dropna(axis=1 منجر به حذف ستون‌های اول و دوم وسوم خواهد شد. (وقتی axis را برابر 1 قرار می‌دهیم یعنی متد روی ستون‌ها کار می‌کند و اگر صفر باشد روی سطرها):

# importing pandas as pd 
import pandas as pd 
# importing numpy as np 
import numpy as np 
# dictionary of lists 
dict = {'First Score':[100, np.nan, np.nan, 95], 
        'Second Score': [30, np.nan, 45, 56], 
        'Third Score':[52, np.nan, 80, 98], 
        'Fourth Score':[60, 67, 68, 65]} 
# creating a dataframe from dictionary   
df = pd.DataFrame(dict) 
# using dropna() function      
df.dropna(axis = 1)
 Fourth Score
060
167
268
365

جمع‌بندی:

در این مقاله به معرفی کتابخانه‌ Pandas در پایتون پرداختیم. پانداس یک کتابخانه‌ی متن باز است که برای کار بر روی داده‌های برچسب‌دار و رابطه‌ای طراحی شده ‌است. چنین ساختار داده‌ای باعث می‌شود تا به کمک عملیات تعریف شده بر روی داده‌های رابطه‌ای تحلیل سودمندی روی داده‌ها انجام داد. این کتابخانه به خاطر قابلیت سرعت و قدرت خوب پردازشی در علم داده بسیار پرکاربرد است و توابع و متدهای فراوانی را فراهم کرده‌است. با مطالعه‌ی این مقاله و انجام مثال‌های آن با این فریم ورک آشنا شده و قادر به شروع انجام پروژه‌ی خود خواهید بود.

اگر دوست داری به یک متخصص پایتون وب تبدیل بشی و در شرکت‌های معتبر مشغول به کار با درآمد بالا بشی ، شرکت در دوره جامع آموزش پایتون را پیشنهاد می‌کنیم.

۱۶ دیدگاه
ما همه سوالات و دیدگاه‌ها رو می‌خونیم و پاسخ میدیم
میلاد ۲۸ آذر ۱۴۰۲، ۱۲:۳۵

سلام ممنون از محتوای خوبتون من اگه یک دیتایی داشته باشم که مقادیر ورودی به انبار و دیتایی داشته باشم که مقادیر خروجی از انبار باشن بخوام دیتایی بسازم که مقادیر خروجی به نسبت موجودی انبار (به معیار تاریخ) باشه چه نوع کدی باید بزنم؟

نازنین کریمی مقدم ۰۹ دی ۱۴۰۲، ۱۲:۰۸

درود معمولترین کار این هست که دیتای ورودی و خروجی رو در دو دیتافریم مختلف بریزید و این دو رو براساس تاریخ مرتب کنید. بعد هر عضو رو با نظیرش مقایسه کنید.

۱۸ فروردین ۱۴۰۲، ۱۱:۵۴

سلام متشکرم از آموزشتون. چطور میتونم در یک ستون از دیتا فریم هر داده رو منهای داده قبلش کنم و در ستونی جدید قرار بدم؟

نازنین کریمی مقدم ۱۹ فروردین ۱۴۰۲، ۱۵:۰۶

درود باید از حلقه کمک بگیرید. <a href="https://stackoverflow.com/questions/47661395/adding-string-values-from-previous-row-to-next-row-in-pandas" target="_blank" rel="noopener nofollow ugc">این تاپیک</a> استک درمورد اضافه کردن مقدار هست به راحتی میتونید بجاش از منها استفاده کنید.

۰۵ دی ۱۴۰۱، ۱۱:۱۹

سلام و وقت بخیر چطور میشه در ستون یک دیتا فریم داده هارو دوتا دوتا باهم مقایسه کرد و ماکسیمم آنهارو برگرداند؟ در کل چطور میشه با یک ستون از دیتا فریم کار کرد؟

نازنین کریمی مقدم ۰۵ دی ۱۴۰۱، ۱۷:۲۴

درود بله شدنی هست. پیشنهاد میکنم که <a href="https://stackoverflow.com/questions/64149670/how-to-compare-data-from-the-same-column-in-a-dataframe-pandas" target="_blank" rel="noopener nofollow ugc">این تاپیک استک</a> رو مطالعه کنید جوابتون به طور کامل درونش هست.

۲۶ بهمن ۱۴۰۰، ۰۶:۳۷

سلام من اگر بخوام دو تا دیتا فریم رو به هم وصل کنم یعنی مثلا اولی از ایندکس 0 تا 10 هست دومی 0 تا 5 می‌خوام دومی بیاد زیر اول و در کل یه دیتا فریم با ایندکس 0 تا 15 به من بده ، باید چ کنم ؟

نازنین کریمی مقدم ۲۷ بهمن ۱۴۰۰، ۱۴:۲۴

درود <a href="https://stackoverflow.com/questions/46755146/combine-dataframes-with-different-indexes-in-pandas" target="_blank" rel="noopener nofollow ugc">جوابهای این سوال</a> رو مطالعه کنید.

۱۵ دی ۱۴۰۰، ۱۴:۴۴

سلام.ممنون از نکات خوبتون...چطور میتونیم یک ستون از دیتافریم را در عددی ضرب یا تقسیم یا بطور کلی عملیات ریاضی روی آن انجام بدیم و بصورت inplace ستون نهایی در دیتافریم رو داشته باشیم؟

نازنین کریمی مقدم ۱۷ دی ۱۴۰۰، ۱۳:۰۸

درود 1. فرض کنید یک ستون با نام b دارید و میخواید یک عملیات ریاضی : مثلا 10 واحد اضافه کنید. به اینصورت میشه: df['b'] + 10 2. اگر میخواید مقدار جدید جایگزین ستون قبلی بشه کافیه به این صورت بنویسید: df['b'] += 10 اگر نه که یک ستون جدید تعریف کنید و عبارت بالا رو بهش اساین کنید. پایدار باشید

عماد ۰۸ شهریور ۱۴۰۰، ۱۱:۲۸

سلام خسته نباشید اموزشتون عالی بود.ببخشید اون ستون سمت چپ که اعداد از 0 تا 3 توش هستن رو میشه از طریق کد پاک کرد؟با سپاس فراوان.

نازنین کریمی مقدم ۱۳ شهریور ۱۴۰۰، ۲۰:۲۱

درود به اون اعداد ایندکس گفته میشه و صرفا حالت نمایشی دارند. با این کد، میتونید در پرینت پاکشون کنید: print(df.to_string(index=False))

محمد ۰۱ اردیبهشت ۱۴۰۰، ۰۸:۴۴

عالی بود! ممنون.

زهره ۲۱ شهریور ۱۳۹۹، ۰۶:۵۱

سلام با تشکر از آموزش شما این دستور کار نمیکنه نیاز به دو تا کروشه دیگه هم داره: ['df.loc['Person1','Person2 به این صورت کار میکنه: [['df.loc[['Person1','Person2

المیرا ناصح ۲۱ شهریور ۱۳۹۹، ۰۹:۳۴

سلام. ممنون از دقت و توجه شما. اصلاح شد.

ثمین ۳۱ مرداد ۱۳۹۹، ۲۰:۵۰

عالییییی بود! ممنون

  • ساختار داده‌ها در کتابخانه Pandas
  • نوع داده‌ی Series
  • انتخاب و دستیابی به عناصر سری با مکان داده
  • اجرای عملیات باینری روی سری‌ها
  • دیتافریم (Dataframe) در کتابخانه Pandas
  • کار با سطرها و ستون‌ها در دیتافریم (Dataframe)
  • دسترسی به دیتافریم (Dataframe) با اندیس‌دهی بولین
  • دسترسی به عناصر دیتافریم (Dataframe) با اپراتورهای منطقی روی ستون‌ها وسطرها
  • مرتب‌سازی عناصر دیتافریم (Dataframe) در کتابخانه Pandas
  • کار با مقادیر ناموجود یا تهی در دیتافریم (Dataframe)
اشتراک گذاری مقاله در :