28 KiB
- 📘 روز ۲۵
📘 روز ۲۵
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
Countries Series
Cities Series
همانطور که میبینید، pandas series تنها یک ستون از دادهها است. اگر بخواهیم چندین ستون داشته باشیم از data frames استفاده میکنیم. مثال زیر pandas DataFrames را نشان میدهد.
بیایید یک مثال از یک pandas data frame ببینیم:
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 |
تمرینات: روز ۲۵
- فایل hacker_news.csv را از پوشه data بخوانید
- پنج سطر اول را بگیرید
- پنج سطر آخر را بگیرید
- ستون title را به عنوان یک pandas series بگیرید
- تعداد سطرها و ستونها را بشمارید
- عناوینی که شامل python هستند را فیلتر کنید
- عناوینی که شامل JavaScript هستند را فیلتر کنید
- دادهها را کاوش کرده و مفهوم آن را درک کنید
🎉 تبریک میگویم ! 🎉





