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

Bu məqalə "Ömər Bayramov ilə Verilənlər elmi əsasları:" silsiləsinə daxildir

image_banner_01.jpg

İ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:

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ı:

row_based_df_creation.PNGİ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','[email protected]',1), 
('Ali','Aliyev','[email protected]',0), 
('Dmitry','Vladimirov','[email protected]',1), 
('Donald','Trump','[email protected]',1), 
('Rashid','Maniyev','[email protected]',1)

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

email_list_lst=[('Omar','Bayramov','[email protected]',1),
                ('Ali','Aliyev','[email protected]',0),
                ('Dmitry','Vladimirov','[email protected]',1),
                ('Donald','Trump','[email protected]',1),
                ('Rashid','Maniyev','[email protected]',1),
               ]

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

email_list_lst_cln=['f_name','l_name','email_adrs','a_status',]

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

df=pd.DataFrame.from_records(email_list_lst, columns=email_list_lst_cln)
df
f_name l_name email_adrs a_status
0 Omar Bayramov [email protected] 1
1 Ali Aliyev [email protected] 0
2 Dmitry Vladimirov [email protected] 1
3 Donald Trump [email protected] 1
4 Rashid Maniyev [email protected] 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.column_based_df_creation.PNG

email_list_lst=[('f_name', ['Omar', 'Ali', 'Dmitry', 'Donald', 'Rashid',]),
                ('l_name', ['Bayramov', 'Aliyev', 'Vladimirov', 'Trump', 'Maniyev',]),
                ('email_adrs', ['[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]',]),
                ('a_status', [1, 0, 1, 1, 1,]),
               ]
df = pd.DataFrame.from_items(email_list_lst)
df
f_name l_name email_adrs a_status
0 Omar Bayramov [email protected] 1
1 Ali Aliyev [email protected] 0
2 Dmitry Vladimirov [email protected] 1
3 Donald Trump [email protected] 1
4 Rashid Maniyev [email protected] 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.cell_based_df_creation.PNGSözügedən misala yaxından baxaq:

email_list=[{
             'f_name' : 'Omar', 
             'l_name': 'Bayramov', 
             'email_adrs' : 'om[email protected]', 
             'a_status' : 1
            },
            {'f_name' : 'Ali', 'l_name': 'Aliyev', 'email_adrs':'[email protected]', 'a_status' : 0},
            {'f_name': 'Dmitry', 'l_name': 'Vladimirov', 'email_adrs':'[email protected]', 'a_status':1},
            {'f_name': 'Donald', 'l_name': 'Trump', 'email_adrs':'[email protected]', 'a_status':1},
            {'f_name': 'Rashid', 'l_name': 'Maniyev', 'email_adrs':'[email protected]', 'a_status':1},
           ]
df=pd.DataFrame(email_list,)
df
a_status email_adrs f_name l_name
0 1 [email protected] Omar Bayramov
1 0 [email protected] Ali Aliyev
2 1 [email protected] Dmitry Vladimirov
3 1 [email protected] Donald Trump
4 1 [email protected] 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.

df=df[['f_name','l_name','email_adrs','a_status',]]
df
f_name l_name email_adrs a_status
0 Omar Bayramov [email protected] 1
1 Ali Aliyev [email protected] 0
2 Dmitry Vladimirov [email protected] 1
3 Donald Trump [email protected] 1
4 Rashid Maniyev [email protected] 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.column_based_df_creation.PNG

email_list_dct={'f_name': ['Omar', 'Ali', 'Dmitry', 'Donald', 'Rashid',],
                'l_name': ['Bayramov', 'Aliyev', 'Vladimirov', 'Trump', 'Maniyev',],
                'email_adrs': ['[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]',],
                'a_status': [1, 0, 1, 1, 1,],
                }

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

df = pd.DataFrame.from_dict(email_list_dct)
df=df[['f_name','l_name','email_adrs','a_status',]]
df
f_name l_name email_adrs a_status
0 Omar Bayramov [email protected] 1
1 Ali Aliyev [email protected] 0
2 Dmitry Vladimirov [email protected] 1
3 Donald Trump [email protected] 1
4 Rashid Maniyev [email protected] 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.

df = pd.read_excel('https://raw.githubusercontent.com/limpapud/datasets/master/Tutorial_datasets/excel_to_dataframe.xlsx',
                   sheet_name='data_for_ttrl')
df
f_name l_name email_adrs a_status
0 Omar Bayramov [email protected] 1
1 Ali Aliyev [email protected] 0
2 Dmitry Vladimirov [email protected] 1
3 Donald Trump [email protected] 1
4 Rashid Maniyev [email protected] 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.

df = pd.read_csv('https://raw.githubusercontent.com/limpapud/datasets/master/Tutorial_datasets/csv_to_dataframe.csv', 
                 delimiter=',')
df
f_name l_name email_adrs a_status
0 Omar Bayramov [email protected] 1
1 Ali Aliyev [email protected] 0
2 Dmitry Vladimirov [email protected] 1
3 Donald Trump [email protected] 1
4 Rashid Maniyev [email protected] 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”: “[email protected]”, “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.

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
f_name l_name email_adrs a_status
0 Omar Bayramov [email protected] 1
1 Ali Aliyev [email protected] 0
2 Dmitry Vladimirov [email protected] 1
3 Donald Trump [email protected] 1
4 Rashid Maniyev [email protected] 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.

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.

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.

data=a.fetchall()
a.close()
data
[('Omar', 'Bayramov', '[email protected]', 1),
 ('Ali', 'Aliyev', '[email protected]', 0),
 ('Dmitry', 'Vladimirov', '[email protected]', 1),
 ('Donald', 'Trump', '[email protected]', 1),
 ('Rashid', 'Maniyev', '[email protected]', 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ı:

df=pd.DataFrame(data, columns=['f_name','l_name','email_adrs','a_status',])
df
f_name l_name email_adrs a_status
0 Omar Bayramov [email protected] 1
1 Ali Aliyev [email protected] 0
2 Dmitry Vladimirov [email protected] 1
3 Donald Trump [email protected] 1
4 Rashid Maniyev [email protected] 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.

Səs: +10. Bəyənilsin Zəifdir

Müəllif: Omar Bayramov

Şərh yazın