30-Days-Of-Python/Persain/25_pandas.md

28 KiB
Raw Permalink Blame History

۳۰ روز با پایتون: روز ۲۵ - Pandas

Twitter Follow

نویسنده: Asabeneh Yetayeh
ویرایش دوم: جولای، ۲۰۲۱

<< روز ۲۴ | روز ۲۶ >>

30DaysOfPython

📘 روز ۲۵

Pandas

Pandas یک کتابخانه متن‌باز، با کارایی بالا و با ساختارهای داده و ابزارهای تحلیل داده آسان برای زبان برنامه‌نویسی پایتون است. Pandas ساختارهای داده و ابزارهایی را اضافه می‌کند که برای کار با داده‌های جدولی مانند Series و DataFrames طراحی شده‌اند. Pandas ابزارهایی برای دستکاری داده‌ها فراهم می‌کند:

  • تغییر شکل (reshaping)
  • ادغام (merging)
  • مرتب‌سازی (sorting)
  • برش‌دهی (slicing)
  • تجمیع (aggregation)
  • جایگزینی مقادیر گمشده (imputation). اگر از anaconda استفاده می‌کنید، نیازی به نصب pandas ندارید.

نصب Pandas

برای مک:

pip install conda
conda install pandas

برای ویندوز:

pip install conda
pip install pandas

ساختار داده Pandas بر اساس Series و DataFrames است.

یک series یک ستون است و یک DataFrame یک جدول چندبعدی است که از مجموعه‌ای از seriesها تشکیل شده است. برای ایجاد یک series در pandas باید از numpy برای ایجاد آرایه‌های یک‌بعدی یا یک لیست پایتون استفاده کنیم. بیایید یک مثال از series ببینیم:

Names Pandas Series

pandas series

Countries Series

pandas series

Cities Series

pandas series

همانطور که می‌بینید، pandas series تنها یک ستون از داده‌ها است. اگر بخواهیم چندین ستون داشته باشیم از data frames استفاده می‌کنیم. مثال زیر pandas DataFrames را نشان می‌دهد.

بیایید یک مثال از یک pandas data frame ببینیم:

Pandas data frame

Data frame مجموعه‌ای از سطرها و ستون‌ها است. به جدول زیر نگاه کنید؛ این جدول ستون‌های بسیار بیشتری نسبت به مثال بالا دارد:

Pandas data frame

در ادامه، خواهیم دید که چگونه pandas را وارد کنیم و چگونه با استفاده از pandas، Series و DataFrames ایجاد کنیم.

وارد کردن Pandas

import pandas as pd # وارد کردن pandas با نام مستعار pd
import numpy  as np # وارد کردن numpy با نام مستعار np

ایجاد Series در Pandas با ایندکس پیش‌فرض

nums =
s = pd.Series(nums)
print(s)
    0    1
    1    2
    2    3
    3    4
    4    5
    dtype: int64

ایجاد Series در Pandas با ایندکس سفارشی

nums =
s = pd.Series(nums, index=)
print(s)
    1    1
    2    2
    3    3
    4    4
    5    5
    dtype: int64
fruits = ['Orange','Banana','Mango']
fruits = pd.Series(fruits, index=)
print(fruits)
    1    Orange
    2    Banana
    3     Mango
    dtype: object

ایجاد Series در Pandas از یک دیکشنری

dct = {'name':'Asabeneh','country':'Finland','city':'Helsinki'}
s = pd.Series(dct)
print(s)
    name       Asabeneh
    country     Finland
    city       Helsinki
    dtype: object

ایجاد یک Series ثابت در Pandas

s = pd.Series(10, index =)
print(s)
    1    10
    2    10
    3    10
    dtype: int64

ایجاد یک Series در Pandas با استفاده از Linspace

s = pd.Series(np.linspace(5, 20, 10)) # linspace(شروع, پایان, تعداد آیتم‌ها)
print(s)```

```sh
    0     5.000000
    1     6.666667
    2     8.333333
    3    10.000000
    4    11.666667
    5    13.333333
    6    15.000000
    7    16.666667
    8    18.333333
    9    20.000000
    dtype: float64

DataFrameها

DataFrameهای Pandas را می‌توان به روش‌های مختلفی ایجاد کرد.

ایجاد DataFrame از لیستی از لیست‌ها

data = [
    ['Asabeneh', 'Finland', 'Helsink'], 
    ['David', 'UK', 'London'],
    ['John', 'Sweden', 'Stockholm']
]
df = pd.DataFrame(data, columns=['Names','Country','City'])
print(df)
Names Country City
0 Asabeneh Finland Helsink
1 David UK London
2 John Sweden Stockholm

ایجاد DataFrame با استفاده از دیکشنری

data = {'Name': ['Asabeneh', 'David', 'John'], 'Country':[
    'Finland', 'UK', 'Sweden'], 'City': ['Helsiki', 'London', 'Stockholm']}
df = pd.DataFrame(data)
print(df)
Name Country City
0 Asabeneh Finland Helsiki
1 David UK London
2 John Sweden Stockholm

ایجاد DataFrame از لیستی از دیکشنری‌ها

data = [
    {'Name': 'Asabeneh', 'Country': 'Finland', 'City': 'Helsinki'},
    {'Name': 'David', 'Country': 'UK', 'City': 'London'},
    {'Name': 'John', 'Country': 'Sweden', 'City': 'Stockholm'}]
df = pd.DataFrame(data)
print(df)
Name Country City
0 Asabeneh Finland Helsinki
1 David UK London
2 John Sweden Stockholm

خواندن فایل CSV با استفاده از Pandas

برای دانلود فایل CSV مورد نیاز در این مثال، استفاده از کنسول/خط فرمان کافی است:

curl -O https://raw.githubusercontent.com/Asabeneh/30-Days-Of-Python/master/data/weight-height.csv

فایل دانلود شده را در پوشه کاری خود قرار دهید.

import pandas as pd

df = pd.read_csv('weight-height.csv')
print(df)

کاوش داده‌ها

بیایید با استفاده از ()head فقط ۵ سطر اول را بخوانیم.

print(df.head()) # پنج سطر را می‌دهد، می‌توانیم با ارسال آرگومان به متد ()head تعداد سطرها را افزایش دهیم
Gender Height Weight
0 Male 73.847017 241.893563
1 Male 68.781904 162.310473
2 Male 74.110105 212.740856
3 Male 71.730978 220.042470
4 Male 69.881796 206.349801

بیایید با استفاده از متد ()tail، آخرین رکوردهای dataframe را نیز بررسی کنیم.

print(df.tail()) # tails پنج سطر آخر را می‌دهد، می‌توانیم با ارسال آرگومان به متد tail تعداد سطرها را افزایش دهیم
Gender Height Weight
9995 Female 66.172652 136.777454
9996 Female 67.067155 170.867906
9997 Female 63.867992 128.475319
9998 Female 69.034243 163.852461
9999 Female 61.944246 113.649103

همانطور که می‌بینید، فایل csv سه ستون دارد: Gender، Height و Weight. اگر DataFrame سطرهای زیادی داشت، دانستن تمام ستون‌ها دشوار بود. بنابراین، باید از یک متد برای دانستن ستون‌ها استفاده کنیم. ما تعداد سطرها را نمی‌دانیم. بیایید از متد shape استفاده کنیم.

print(df.shape) # همانطور که می‌بینید ۱۰۰۰۰ سطر و سه ستون
(10000, 3)

بیایید با استفاده از columns تمام ستون‌ها را بگیریم.

print(df.columns)
Index(['Gender', 'Height', 'Weight'], dtype='object')

حالا، بیایید با استفاده از کلید ستون، یک ستون خاص را بگیریم.

heights = df['Height'] # این اکنون یک series است
print(heights)
    0       73.847017
    1       68.781904
    2       74.110105
    3       71.730978
    4       69.881796
              ...    
    9995    66.172652
    9996    67.067155
    9997    63.867992
    9998    69.034243
    9999    61.944246
    Name: Height, Length: 10000, dtype: float64
weights = df['Weight'] # این اکنون یک series است
print(weights)
    0       241.893563
    1       162.310473
    2       212.740856
    3       220.042470
    4       206.349801
               ...    
    9995    136.777454
    9996    170.867906
    9997    128.475319
    9998    163.852461
    9999    113.649103
    Name: Weight, Length: 10000, dtype: float64
print(len(heights) == len(weights))
True

متد ()describe مقادیر آماری توصیفی یک مجموعه داده را فراهم می‌کند.

print(heights.describe()) # اطلاعات آماری درباره داده‌های قد را می‌دهد
    count    10000.000000
    mean        66.367560
    std          3.847528
    min         54.263133
    25%         63.505620
    50%         66.318070
    75%         69.174262
    max         78.998742
    Name: Height, dtype: float64
print(weights.describe())
    count    10000.000000
    mean       161.440357
    std         32.108439
    min         64.700127
    25%        135.818051
    50%        161.212928
    75%        187.169525
    max        269.989699
    Name: Weight, dtype: float64```

```python
print(df.describe())  # describe همچنین می‌تواند اطلاعات آماری از یک dataFrame بدهد
Height Weight
count 10000.000000 10000.000000
mean 66.367560 161.440357
std 3.847528 32.108439
min 54.263133 64.700127
25% 63.505620 135.818051
50% 66.318070 161.212928
75% 69.174262 187.169525
max 78.998742 269.989699

مشابه ()describe، متد ()info نیز اطلاعاتی درباره مجموعه داده می‌دهد.

تغییر یک DataFrame

تغییر یک DataFrame: * ما می‌توانیم یک DataFrame جدید ایجاد کنیم * ما می‌توانیم یک ستون جدید ایجاد کرده و آن را به DataFrame اضافه کنیم، * ما می‌توانیم یک ستون موجود را از DataFrame حذف کنیم، * ما می‌توانیم یک ستون موجود در DataFrame را تغییر دهیم، * ما می‌توانیم نوع داده مقادیر ستون در DataFrame را تغییر دهیم

ایجاد یک DataFrame

مثل همیشه، ابتدا بسته‌های لازم را وارد می‌کنیم. اکنون، بیایید pandas و numpy، دو دوست همیشگی را وارد کنیم.

import pandas as pd
import numpy as np
data = [
    {"Name": "Asabeneh", "Country":"Finland","City":"Helsinki"},
    {"Name": "David", "Country":"UK","City":"London"},
    {"Name": "John", "Country":"Sweden","City":"Stockholm"}]
df = pd.DataFrame(data)
print(df)
Name Country City
0 Asabeneh Finland Helsinki
1 David UK London
2 John Sweden Stockholm

افزودن یک ستون به DataFrame مانند افزودن یک کلید به دیکشنری است.

ابتدا بیایید از مثال قبلی برای ایجاد یک DataFrame استفاده کنیم. پس از ایجاد DataFrame، شروع به تغییر ستون‌ها و مقادیر ستون‌ها خواهیم کرد.

افزودن یک ستون جدید

بیایید یک ستون وزن (Weight) به DataFrame اضافه کنیم

weights =
df['Weight'] = weights
df
Name Country City Weight
0 Asabeneh Finland Helsinki 74
1 David UK London 78
2 John Sweden Stockholm 69

بیایید یک ستون قد (Height) نیز به DataFrame اضافه کنیم

heights =
df['Height'] = heights
print(df)
Name Country City Weight Height
0 Asabeneh Finland Helsinki 74 173
1 David UK London 78 175
2 John Sweden Stockholm 69 169

همانطور که در DataFrame بالا می‌بینید، ما ستون‌های جدید Weight و Height را اضافه کردیم. بیایید یک ستون اضافی دیگر به نام BMI (شاخص توده بدنی) با محاسبه BMI آنها با استفاده از جرم و قدشان اضافه کنیم. BMI برابر است با جرم تقسیم بر مجذور قد (به متر) - Weight/Height * Height.

همانطور که می‌بینید، قد به سانتی‌متر است، بنابراین باید آن را به متر تغییر دهیم. بیایید سطر قد را تغییر دهیم.

تغییر مقادیر ستون

df['Height'] = df['Height'] * 0.01
df
Name Country City Weight Height
0 Asabeneh Finland Helsinki 74 1.73
1 David UK London 78 1.75
2 John Sweden Stockholm 69 1.69
# استفاده از توابع کد ما را تمیزتر می‌کند، اما می‌توانید bmi را بدون آن محاسبه کنید
def calculate_bmi ():
    weights = df['Weight']
    heights = df['Height']
    bmi = []
    for w,h in zip(weights, heights):
        b = w/(h*h)
        bmi.append(b)
    return bmi
    
bmi = calculate_bmi()

df['BMI'] = bmi
df
Name Country City Weight Height BMI
0 Asabeneh Finland Helsinki 74 1.73 24.725183
1 David UK London 78 1.75 25.469388
2 John Sweden Stockholm 69 1.69 24.158818

قالب‌بندی ستون‌های DataFrame

مقادیر ستون BMI در DataFrame از نوع float با ارقام معنی‌دار زیادی بعد از اعشار هستند. بیایید آن را به یک رقم معنی‌دار بعد از نقطه تغییر دهیم.

df['BMI'] = round(df['BMI'], 1)
print(df)
Name Country City Weight Height BMI
0 Asabeneh Finland Helsinki 74 1.73 24.7
1 David UK London 78 1.75 25.5
2 John Sweden Stockholm 69 1.69 24.2

اطلاعات در DataFrame هنوز کامل به نظر نمی‌رسد، بیایید ستون‌های سال تولد و سال جاری را اضافه کنیم.

birth_year = ['1769', '1985', '1990']
current_year = pd.Series(2020, index=)
df['Birth Year'] = birth_year
df['Current Year'] = current_year
df
Name Country City Weight Height BMI Birth Year Current Year
0 Asabeneh Finland Helsinki 74 1.73 24.7 1769 2020
1 David UK London 78 1.75 25.5 1985 2020
2 John Sweden Stockholm 69 1.69 24.2 1990 2020

بررسی نوع داده‌های مقادیر ستون

print(df.Weight.dtype)
    dtype('int64')
df['Birth Year'].dtype # این یک شیء رشته‌ای می‌دهد، باید آن را به عدد تغییر دهیم

df['Birth Year'] = df['Birth Year'].astype('int')
print(df['Birth Year'].dtype) # بیایید اکنون نوع داده را بررسی کنیم
    dtype('int32')

حالا همین کار را برای سال جاری انجام می‌دهیم:

df['Current Year'] = df['Current Year'].astype('int')
df['Current Year'].dtype
    dtype('int32')

اکنون، مقادیر ستون سال تولد و سال جاری از نوع integer هستند. می‌توانیم سن را محاسبه کنیم.

ages = df['Current Year'] - df['Birth Year']
ages
0    251
1     35
2     30
dtype: int32
df['Ages'] = ages
print(df)
Name Country City Weight Height BMI Birth Year Current Year Ages
0 Asabeneh Finland Helsinki 74 1.73 24.7 1769 2019 250
1 David UK London 78 1.75 25.5 1985 2019 34
2 John Sweden Stockholm 69 1.69 24.2 1990 2019 29

فردی که در سطر اول قرار دارد تاکنون ۲۵۱ سال زندگی کرده است. بعید است کسی اینقدر عمر کند. یا این یک اشتباه تایپی است یا داده‌ها ساختگی هستند. پس بیایید آن داده را با میانگین ستون‌ها بدون در نظر گرفتن داده پرت پر کنیم.

mean = (35 + 30)/ 2

mean = (35 + 30)/ 2
print('Mean: ',mean)	#خوب است که توضیحاتی به خروجی اضافه کنیم، تا بدانیم هر چیز چیست
   Mean:  32.5

ایندکس‌گذاری بولین

print(df[df['Ages'] > 120])```

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>Name</th>
      <th>Country</th>
      <th>City</th>
      <th>Weight</th>
      <th>Height</th>
      <th>BMI</th>
      <th>Birth Year</th>
      <th>Current Year</th>
      <th>Ages</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>Asabeneh</td>
      <td>Finland</td>
      <td>Helsinki</td>
      <td>74</td>
      <td>1.73</td>
      <td>24.7</td>
      <td>1769</td>
      <td>2020</td>
      <td>251</td>
    </tr>
  </tbody>
</table>


```python
print(df[df['Ages'] < 120])
Name Country City Weight Height BMI Birth Year Current Year Ages
1 David UK London 78 1.75 25.5 1985 2020 35
2 John Sweden Stockholm 69 1.69 24.2 1990 2020 30

تمرینات: روز ۲۵

  1. فایل hacker_news.csv را از پوشه data بخوانید
  2. پنج سطر اول را بگیرید
  3. پنج سطر آخر را بگیرید
  4. ستون title را به عنوان یک pandas series بگیرید
  5. تعداد سطرها و ستون‌ها را بشمارید
    • عناوینی که شامل python هستند را فیلتر کنید
    • عناوینی که شامل JavaScript هستند را فیلتر کنید
    • داده‌ها را کاوش کرده و مفهوم آن را درک کنید

🎉 تبریک می‌گویم ! 🎉

<< روز ۲۴ | روز ۲۶ >>