بخش چهارم آموزش پایتون را با آموزش کتابخانه Numpy به پایان بردیم. در ادامه این قسمت بحث Pandas را پی میگیریم.
ابتدا کتابخانه ها را ایمپورت میکنیم:
import pandas as pd
import numpy as np
میخواهیم یک لیست برچسب دار بسازیم:
labels = ['a', 'b', 'c']
my_list = [10, 20, 30]
arr = np.array([10, 20, 30])
d = {'a': 10, 'b': 20, 'c': 30}
این کار را با کتابخانه pandas و Numpy و طرق دیگر با مشخص کردن data و Index انجام میدهیم:
# 1 - list
pd.Series(data = my_list , index = labels)
# 2 - numpy array
pd.Series(data = arr, index = labels)
#3 - dict
pd.Series(data = d)
#4
pd.Series(data = d, index = labels)
Working with Series
دیتای زیر مقادیر فروش در روزهای محتلف هفته را نشان میدهد:
sells1 = pd.Series([1000,2000,2500,1500],index = ['SAT','SUN','MON','TUE'])
sells2 = pd.Series([500,1100,2000,3500],index = ['SAT','SUN','THU', 'FRI'])
حال میخواهیم مقدار فروش در همه روزهای هفته را مشاهده کنیم(با شرط داشتن فروش در هر دو دسته sell1 و sell2):
sells1 + sells2
FRI NaN
MON NaN
SAT 1500.0
SUN 3100.0
THU NaN
TUE NaN
dtype: float64
DataFrames
میخواهیم یک ماتریس 6ردیفه در 4 ستون بسازیم و همچنین نام ردیف(ایندکس)و نام ستون ها را نیز در یک متغیر مستقل تعریف میکنیم.
arr = np.random.randn(6,4)
ind = ['A', 'B', 'C', 'D', 'E', 'F']
cols = ['W', 'X', 'Y', 'Z']
arr
array([[ 0.18634557, 0.61764637, -1.68146026, -0.74306913],
[-1.11226964, 1.0265941 , 0.12574059, 0.25364223],
[-0.19876086, -0.46942428, -0.9216151 , -2.13352233],
[ 1.14281602, 0.0407859 , -1.30831831, -0.46343872],
[-0.24328887, -0.34948488, 0.43473536, -1.70888584],
[-0.3089345 , 1.12381186, 0.49135135, -0.4656304 ]])
اما مشاهده میشود این دیتا آن طور که مطلوب ماست مشاهده نمیشود. چون در قالب دیتافریم قرار ندارد.
Create DataFrames
برای ساخت دیتا فریم باید data و columns و شاخص index را تعریف کنیم:
# 1- numpy array
pd.DataFrame(data = arr , index = ind, columns = cols )

تبدیل دیتافریم:
نمونه 1: لیستی از دیکشنری ها
ابتدا لیستی از دیکشنری ها را به صورت زیر تعریف میکنیم:
l_dict =
[{'W': 100,'X': 200, 'Y': 300, 'Z': 350},
{'W': 104,'X': 230, 'Y': 400, 'Z': 280},
{'W': 1000,'X': 450, 'Y': 400, 'Z': 310}]
با دستور زیر لییست فوق را به دیتافریم تبدیل میکنیم. ضمن اینکه شاخص a,b,c را نیز به آن می افزاییم:
pd.DataFrame(data = l_dict , index = ['A', 'B', 'C'])

نمونه 2: دیکشنری از لیستها
نمونه زیر را داریم که دیکشنری از لیست ها است:
d_list =
{'W':[100, 104, 1000],
'X':[200, 230, 450],
'Y':[300, 400, 400],
'Z':[350, 280, 310]}
این مورد را نیز میتوان با دستور زیر به دیتافریم تبدیل نمود:
pd.DataFrame(data = d_list, index = ['a', 'b', 'c'])
getting info about DF
دستور زیر به طور پیشفرض 5 ردیف اول از دیتافریم را برمیگردارند مگر اینکه خودمان تعیین کنیم که چند ردیف را برگرداند:
df.head(2)
#last 5 rows
df.tail()
دستور زیر اطلاعاتی در مورد کمینه ، بیشینه، مد ، میانه و … را به ما برمیگرداند:
df.describe()
دستور زیر اطلاعاتی در مورد تنوع و تعداد و نوع داده ها به ما میدهد:
df.info()
DataFrame indexing
فرض که دیتای ما به صورت زیر باشد:

با دستور زیر میتوان یک ستون خاص آن را فرا خواند:
df['X']

و یا فراخواند دو ستون از آن:
df[['X', 'Y']]

اگر بخواهیم تنها یک ردیف با ایندکس خاص را مشاهده کنیم:
df.loc['A']

میخواهیم تنها ردیفهای A, C ,D را مشاهده کنیم:
df.loc[['A', 'C', 'D']]

میخواهیم تک عنصر ردیف C و ستون X را مشاهده کنیم:
df.loc['C', 'X']
-0.4694242821694606
میخواهیم از ردیفC تنها عناصر مربوط به ستونX ,Y,Z را ببینیم:
df.loc['C', ['X','Y', 'Z']]

دیدن سطرها و ستونهای خاص:
df.loc[['C', 'F'], ['X', 'Z']]

دیدن سطهای با شاخص A تا D:
df.loc['A': 'D']

دیدن همه سطرها و ستونهای خاص:
df.loc['A': 'D'][['Y','W', 'Z']]

iloc
دستور iloc به ردیف نگاه میکند.
ابتدا نگاهی مجدد به دیتای خود می اندازیم:

مثال:
# iloc
df.iloc[3]

برگرداندن ردیف 1 و 2:
df.iloc[1:3]

نکته: دستور زیر نیز کاری مشابه دستور قبلی انجام میدهد با این تفاوت که سمت راست بازه inclusive است:
df.loc['B':'D']

ردیف 1تا 3 و ستون 1:
df.iloc[1:3, 1]

Subframes
مجددا به df نگاهی می اندازیم:

انتخاب سطرها و ستونهای دلخواه:
df.iloc[[0,2,5], [2, 3]] # A, C, F, col= Y, Z

نمایش فقط سطرهای 0 و 2:
df.iloc[[0,2]]

نمایش با تکرار:
df.iloc[[3,3, 3]]

Modifying DataFrames
دیتافریمی 6 در 4 که شاخص ردیف های آن نام 6 شهر باشد و ستونهای آن 4 کالای دیجیتال باشد و مقادیر ماتریس اعداد رندوم بین1000 تا 2000 باشد
df = pd.DataFrame(np.random.randint(1000,2000,(6,4)),\
index = ['Tehran', 'Shiraz', 'Yazd', 'Tabriz','Mashhad', 'Kerman'],\
columns = ['Laptop', 'Celphone', 'Camera', 'TV'])

تعریف کردن ردیفی که مجموع دستگاهای دیجیتال در هر شهر را نمایش دهد:
df['Sum'] = df['Laptop'] + df['Celphone'] + df['Camera'] + df['TV']

تعداد کتب موجود در شهر را به صورت اعداد رندوم بین 100 تا 2000 به دیتا فریم اضافه کنید:
df['Book'] = np.random.randint(100, 2000, 6)

ستون مربوط به TV را از دیتافریم حذف کنید:
# deleting
df.drop(['TV'], axis = 1)

نکته: مجددا df را نگاه کنیم میبینیم که ستون TV سر جای خودش است. زیرا از inplace=TRUE استفاده نکردیم
ردیف تهران را حذف کنید و (دیتای جدید بدون تهران تشکیل شود)
df.drop('Tehran', axis = 0)

ردیف yazd را حذف کنید:
df.drop(index = 'Yazd')
ستون TV را حذف کنید (روش 2)
df.drop(columns = 'TV')
دو ردیف دلخواه را حذف کنید:
df.drop(columns = ['TV', 'Camera'])
Renaming Columns
ابتدا یک دیتا فریم تشکیل میدهیم:
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})

با دستور زیر میتوان نام ستون ها را تغییر داد:
df.rename(columns = {'A': 'aa', 'B': 'bb'})

Renaming indeces
با دستور زیر میتوان نام شاخص ها را تغییر داد
df.rename(index = {0: 'X', 1: 'Y', 2: 'Z'})
# استعلام نام شاخص ها
df.index
# استعلام نام ستون ها
df.columns