Pandas: DataFreym yaratmağın müxtəlif üsulları

İlk öncə pandas-da verilənlərin 2D əndazəli forma (sadə dil ilə "cədvəl") daxilində saxlanma vasitəsi və forması olan Dataframe yaratmaqdan başlayaq. Bu dərs tam olaraq müxtəlif mənbələrdən və formalarda əldə edilmiş məlumatı Datafreymə çevirmək yolları haqqında bəhs edəcək.

Pandas ilə iş aparmaq üçün modulu əvvəlcə import edək:


In [1]:
import pandas as pd

Datafreymin əsasına yerləşəcək verilənlər mənbə üzrə üzrə daxili və xarici formalara bölünür:

Python daxili mənbələr:

Siyahı: sətr əsaslı:

İlk misal cədvəl daxilində dəyərlərin ard-arda, sətr-bə-sətr, siyahı daxilində DataFreymə daxil edilməsidir. SQL ilə tanış olan oxuyuculara bu dil daxilində İNSERT əmrin yada sala bilər. Məsələn, eyni sorğu SQL vasitəsi ilə aşağıda qeyd olunmuş formada icra oluna bilər

INSERT INTO email ('f_name','l_name','email_adrs','a_status') VALUES ('Omar','Bayramov','omarbayramov@hotmail.com',1), ('Ali','Aliyev','alialiyev@example.com',0), ('Dmitry','Vladimirov','v.dmitry@koala.kl',1), ('Donald','Trump','grabthat@pussycatdolls.com',1), ('Rashid','Maniyev','rashid.maniyev@exponential.az',1)

İlk öncə kortejlərdən ibarət siyahı yaradırıq və onu email_list_lst adlı dəyişənə təhkim edirik.


In [2]:
email_list_lst=[('Omar','Bayramov','omarbayramov@hotmail.com',1),
                ('Ali','Aliyev','alialiyev@example.com',0),
                ('Dmitry','Vladimirov','v.dmitry@koala.kl',1),
                ('Donald','Trump','grabthat@pussycatdolls.com',1),
                ('Rashid','Maniyev','rashid.maniyev@exponential.az',1),
               ]

Növbəti email_list_lst_cln dəyşəninə isə sütun adlarından ibarət siyahı təhkim edirik.


In [3]:
email_list_lst_cln=['f_name','l_name','email_adrs','a_status',]

Nəhayət, DataFrame-nin "from_records" funksiyasına email_list_lstemail_list_lst_cln dəyərlərini ötürüb email_list_lst dəyərlərindən email_list_lst_cln sütunları ilə cədvəl yaradırıq və sonra cədvəli əks etdiririk.


In [4]:
df=pd.DataFrame.from_records(email_list_lst, columns=email_list_lst_cln)
df


Out[4]:
f_name l_name email_adrs a_status
0 Omar Bayramov omarbayramov@hotmail.com 1
1 Ali Aliyev alialiyev@example.com 0
2 Dmitry Vladimirov v.dmitry@koala.kl 1
3 Donald Trump grabthat@pussycatdolls.com 1
4 Rashid Maniyev rashid.maniyev@exponential.az 1

Siyahı: sütun əsaslı:

Əvvəlki misaldan fərqli olaraq bu dəfə məlumatı sütun-sütun qəbul edib cədvələ ötürən yanaşmadan istifadə olunacaq. Bunun üçün kortej siyahısından istifadə olunacaq ki hər bir kortej özü-özlüyündə sütun adın əks edən sətrdən və həmin sətrdə yerləşən dəyərlər siyahısından ibarətdir.


In [5]:
email_list_lst=[('f_name', ['Omar', 'Ali', 'Dmitry', 'Donald', 'Rashid',]),
                ('l_name', ['Bayramov', 'Aliyev', 'Vladimirov', 'Trump', 'Maniyev',]),
                ('email_adrs', ['omarbayramov@hotmail.com', 'alialiyev@example.com', 'v.dmitry@koala.kl', 'grabthat@pussycatdolls.com', 'rashid.maniyev@exponential.az',]),
                ('a_status', [1, 0, 1, 1, 1,]),
               ]
df = pd.DataFrame.from_items(email_list_lst)
df


Out[5]:
f_name l_name email_adrs a_status
0 Omar Bayramov omarbayramov@hotmail.com 1
1 Ali Aliyev alialiyev@example.com 0
2 Dmitry Vladimirov v.dmitry@koala.kl 1
3 Donald Trump grabthat@pussycatdolls.com 1
4 Rashid Maniyev rashid.maniyev@exponential.az 1

Lüğət: yazı əsaslı

Növbəti misal mənim ən çox tərcihə etdiyim (əlbəttə ki çox vaxt verilənlər istədiyimiz formada olmur, və bizim nəyə üstünlük verdiyimiz onları heç marağlandırmır) üsula keçirik. Bu üsula üstünlük verməyimin səbəbi çox sadədir: bundan əvvəl və bundan sonra qeyd olunmuş yollardan istifadə edərkən məlumatın əldə edilməsi zamanı və ya təmizləmə zamanı "NaN" dəyəri almadan bəzi məlumatlar pozula bilər ki bu da sütunun və ya yazının sürüşməsinə gətirə bilər ki o zaman analiz ya qismən çətinləşə, və ya ümumiyyətlə verilənlərin qatışması üzündan mənasın itirə bilər. ( Danışdığım problem ilə tanış olmaq üçün 2017/08 tarixində çalışdığım məlumat əldə edilməsi və analizi işimə baxa bilərsiniz.). Amma bu dəfə hər bir dəyər üzrə hansı sütuna aid olması açıq şəkildə qeyd olunur ki, qeyd olunmadığı halda avtomatik "NaN" olaraq qeyd olunur. Nəticədə əlavə rutin təmizləmə işi aparmağa ehtiyac olmur, olmayan dəyərləri isə araşdırmadan ya yığışdırmaq və ya digər metodlar ilə verilənlər ilə doldurmaq olur. Sözügedən misala yaxından baxaq:


In [6]:
email_list=[{
             'f_name' : 'Omar', 
             'l_name': 'Bayramov', 
             'email_adrs' : 'omarbayramov@hotmail.com', 
             'a_status' : 1
            },
            {'f_name' : 'Ali', 'l_name': 'Aliyev', 'email_adrs':'alialiyev@example.com', 'a_status' : 0},
            {'f_name': 'Dmitry', 'l_name': 'Vladimirov', 'email_adrs':'v.dmitry@koala.kl', 'a_status':1},
            {'f_name': 'Donald', 'l_name': 'Trump', 'email_adrs':'grabthat@pussycatdolls.com', 'a_status':1},
            {'f_name': 'Rashid', 'l_name': 'Maniyev', 'email_adrs':'rashid.maniyev@exponential.az', 'a_status':1},
           ]

In [7]:
df=pd.DataFrame(email_list,)
df


Out[7]:
a_status email_adrs f_name l_name
0 1 omarbayramov@hotmail.com Omar Bayramov
1 0 alialiyev@example.com Ali Aliyev
2 1 v.dmitry@koala.kl Dmitry Vladimirov
3 1 grabthat@pussycatdolls.com Donald Trump
4 1 rashid.maniyev@exponential.az Rashid Maniyev

Burada gördüyünüz kimi məlumat DataFrame daxilinə keçsədə, sütunlar istədiyimiz ardıcıllıqda yox, əlifba ardıcıllığı üzrə sıralanmışdır. Bu məqamı aradan qaldırmaq üçün ya yuxarıda DataFrame yaradan zamandaki kimi əvvəlcədən column parametri vasitəsi ilə sütun adların və ardıcıllığın qeyd etməli, və ya sonradan aşaqda qeyd olunmuş əmr ilə sütun yerlərin dəyşməliyik.


In [8]:
df=df[['f_name','l_name','email_adrs','a_status',]]
df


Out[8]:
f_name l_name email_adrs a_status
0 Omar Bayramov omarbayramov@hotmail.com 1
1 Ali Aliyev alialiyev@example.com 0
2 Dmitry Vladimirov v.dmitry@koala.kl 1
3 Donald Trump grabthat@pussycatdolls.com 1
4 Rashid Maniyev rashid.maniyev@exponential.az 1

Lüğət: sütun əsaslı

Bu misal yuxarıda üzərindən keçdiyimiz "Siyahı:sütun əsaslı"-ya çox oxşayır. Fərq dəyərlərin bu dəfə siyahı şəkilində lüğət açarı olaraq qeyd olunmasıdır.


In [9]:
email_list_dct={'f_name': ['Omar', 'Ali', 'Dmitry', 'Donald', 'Rashid',],
                'l_name': ['Bayramov', 'Aliyev', 'Vladimirov', 'Trump', 'Maniyev',],
                'email_adrs': ['omarbayramov@hotmail.com', 'alialiyev@example.com', 'v.dmitry@koala.kl', 'grabthat@pussycatdolls.com', 'rashid.maniyev@exponential.az',],
                'a_status': [1, 0, 1, 1, 1,],
                }

Cədvəli yaradaq və sütunların yerlərin dəyişək:


In [10]:
df = pd.DataFrame.from_dict(email_list_dct)
df=df[['f_name','l_name','email_adrs','a_status',]]
df


Out[10]:
f_name l_name email_adrs a_status
0 Omar Bayramov omarbayramov@hotmail.com 1
1 Ali Aliyev alialiyev@example.com 0
2 Dmitry Vladimirov v.dmitry@koala.kl 1
3 Donald Trump grabthat@pussycatdolls.com 1
4 Rashid Maniyev rashid.maniyev@exponential.az 1

Python xarici mənbələr:

Standart, Python-un daxili verilən strukturlarından başqa Pandas fayl sistemi, Məlumat bazarı və digər mənbələrdən verilənləri əldə edib cədvəl qurmağa imkan yaradır.

Excel fayl

Cədvəli yaratmaq üçün pandas-ın read_excel funksiyasına Excel faylına işarələyən fayl sistemi yolu, fayl internetdə yerləşən zaman isə URL qeyd etmək bəsdir. Əgər faylda bir neçə səhifə varsa, və ya məhz olaraq müəyyən səhifədə yerləşən məlumatı əldə etmək lazımdırsa o zaman sheet_name parametrinə səhifə adın ötürmək ilə məlumatı cədvələ çevirmək olur.


In [11]:
df = pd.read_excel('https://raw.githubusercontent.com/limpapud/datasets/master/Tutorial_datasets/excel_to_dataframe.xlsx',
                   sheet_name='data_for_ttrl')
df


Out[11]:
f_name l_name email_adrs a_status
0 Omar Bayramov omarbayramov@hotmail.com 1
1 Ali Aliyev alialiyev@example.com 0
2 Dmitry Vladimirov v.dmitry@koala.kl 1
3 Donald Trump grabthat@pussycatdolls.com 1
4 Rashid Maniyev rashid.maniyev@exponential.az 1

CSV

Yuxarıdaki funksiyadaki kimi ilk öncə .csv fayla yol, amma sonra sətr daxilində dəyərləri bir birindən ayıran işarə delimiter parameterinə ötürülməlidir. Ötürülmədikdə standart olaraq vergülü qəbul olunur.


In [12]:
df = pd.read_csv('https://raw.githubusercontent.com/limpapud/datasets/master/Tutorial_datasets/csv_to_dataframe.csv', 
                 delimiter=',')
df


Out[12]:
f_name l_name email_adrs a_status
0 Omar Bayramov omarbayramov@hotmail.com 1
1 Ali Aliyev alialiyev@example.com 0
2 Dmitry Vladimirov v.dmitry@koala.kl 1
3 Donald Trump grabthat@pussycatdolls.com 1
4 Rashid Maniyev rashid.maniyev@exponential.az 1

JSON

Json faylından verilənləri qəbul etmək üçün URL və ya fayl sistemində fayla yol tələb olunur. Json faylı misalı aşağıda qeyd olunub.

[ { "f_name": "Omar", "l_name": "Bayramov", "email_adrs": "omarbayramov@hotmail.com", "a_status": 1 } ..... ]

Diqqət ilə baxdığınız halda özünüz üçün json faylın Lüğət: yazı əsaslı datafreym yaratma metodunda istifadə etdiyimiz dəyər təyinatından heç fərqi olmadığını görmüş oldunuz.


In [13]:
df = pd.read_json('https://raw.githubusercontent.com/limpapud/datasets/master/Tutorial_datasets/json_to_dataframe.json')
df = df[['f_name','l_name','email_adrs','a_status',]]
df


Out[13]:
f_name l_name email_adrs a_status
0 Omar Bayramov omarbayramov@hotmail.com 1
1 Ali Aliyev alialiyev@example.com 0
2 Dmitry Vladimirov v.dmitry@koala.kl 1
3 Donald Trump grabthat@pussycatdolls.com 1
4 Rashid Maniyev rashid.maniyev@exponential.az 1

SQL

Və son olaraq SQLite fayl məlumat bazasından məlumat sorğulayaq və datafreymə yerləşdirək. İlk öncə işimiz üçün tələb olunan modulları import edək.


In [14]:
import sqlalchemy
from sqlalchemy import create_engine
import sqlite3

Sorğulama üçün engine yaradaq və məlumat bazası faylına yolu göstərək.


In [15]:
engine = create_engine('sqlite:///C:/Users/omarbayramov/Documents/GitHub/datasets/Tutorial_datasets/sql_to_dataframe.db')

Qoşulma yaradıb, məlumat bazasında yerləşən emails cədvəlindən bütün sətrləri sorğulayaq.


In [16]:
con=engine.connect()
a=con.execute('SELECT * FROM emails')

Məlumat sorğulandıqdan sonra fetchall funksiyası vasitəsi ilə sətrləri "oxuyub" data dəyişkəninə təhkim edək və sonda MB bağlantısın bağlayaq.


In [17]:
data=a.fetchall()
a.close()
data


Out[17]:
[('Omar', 'Bayramov', 'omarbayramov@hotmail.com', 1),
 ('Ali', 'Aliyev', 'alialiyev@example.com', 0),
 ('Dmitry', 'Vladimirov', 'v.dmitry@koala.kl', 1),
 ('Donald', 'Trump', 'grabthat@pussycatdolls.com', 1),
 ('Rashid', 'Maniyev', 'rashid.maniyev@exponential.az', 1)]

Əldə olunan məlumatın strukturu tanış qəlir mi? Diqqət ilə baxsanız ilk tanış olduğumuz Siyahı: sətr əsaslı məlumat strukturun tanıyarsınız. Artıq tanış olduğumuz proseduru icra edərək cədvəl qurmaq qaldı:


In [18]:
df=pd.DataFrame(data, columns=['f_name','l_name','email_adrs','a_status',])
df


Out[18]:
f_name l_name email_adrs a_status
0 Omar Bayramov omarbayramov@hotmail.com 1
1 Ali Aliyev alialiyev@example.com 0
2 Dmitry Vladimirov v.dmitry@koala.kl 1
3 Donald Trump grabthat@pussycatdolls.com 1
4 Rashid Maniyev rashid.maniyev@exponential.az 1

Jurnalın sonu

Jurnalın sonuna çatdınız. Oxuduğunuz üçün təşəkkürlər. Bu məqalə periodik olaraq yenilənəcək və əlavələr qəbul edəcək. Sizin əlavəniz, təklifiniz, iradınız olduğu halda GitHub vasitəsi ilə "İssue" yaradaraq və ya aşağıda qeyd olunmuş əlaqə vasitələri ilə fikrinizi bildirə bilərsiniz.

Əlaqə

Müəllif ilə əlaqə omarbayramov@hotmail.com elektron ünvan üzərindən aparıla bilər. Əlavə olaraq sosial şəbəkə və digər saytlara linklər əlavə olunur. Facebook Wordpress Blog LinkedIn