Python Pandas alapok
# Import
import pandas as pd
## csv olvasás + írás
user = pd.read_csv('ugyfelcsv1.csv', header=None, nrows=5) ## csv-ből olvasás, nincs fejlécsor, az első 5 sort
user ## megjelenítés
user.to_csv('ugyfelcsv1_kimenet.csv') ## csv-be mentés
## xls olvasás + írás
xlsx = pd.ExcelFile('telepules.xlsx') ## xls-ből olvasás
df = pd.read_excel(xlsx, 'telepules') ## aktív munkalap kijelőlése
df ## megjelenítés
#df.to_excel('telepules_kimenet.xlsx', sheet_name='Tel') ## xls-be mentés
helyseg | lakos | |
---|---|---|
0 | Debrecen | 204333 |
1 | Miskolc | 162905 |
2 | Szeged | 161837 |
3 | Pécs | 147719 |
4 | Budapest 11. ker. | 144599 |
... | ... | ... |
3171 | Felsőszenterzsébet | 17 |
3172 | Tornakápolna | 15 |
3173 | Tornabarakony | 14 |
3174 | Gagyapáti | 13 |
3175 | Iborfia | 9 |
3176 rows × 2 columns
## alap infok (pandas)
print('Sor, oszlop szám' ,df.shape) ## sor és oszlopszám kiírása
print('index', df.index)
print('Oszlop nevek', df.columns)
print('ifo',df.info())
print('count',df.count())
print('cumsum', df.cumsum())
print('describe',df.describe())
print('Elemi egyedi értékek',df['helyseg'].unique())
print('Elemi értékek száma',df['helyseg'].nunique())
Sor, oszlop szám (3176, 2) index RangeIndex(start=0, stop=3176, step=1) Oszlop nevek Index(['helyseg', 'lakos'], dtype='object') <class 'pandas.core.frame.DataFrame'> RangeIndex: 3176 entries, 0 to 3175 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 helyseg 3176 non-null object 1 lakos 3176 non-null int64 dtypes: int64(1), object(1) memory usage: 49.8+ KB ifo None count helyseg 3176 lakos 3176 dtype: int64 cumsum helyseg lakos 0 Debrecen 204333 1 DebrecenMiskolc 367238 2 DebrecenMiskolcSzeged 529075 3 DebrecenMiskolcSzegedPécs 676794 4 DebrecenMiskolcSzegedPécsBudapest 11. ker. 821393 ... ... ... 3171 DebrecenMiskolcSzegedPécsBudapest 11. ker.Győr... 9908747 3172 DebrecenMiskolcSzegedPécsBudapest 11. ker.Győr... 9908762 3173 DebrecenMiskolcSzegedPécsBudapest 11. ker.Győr... 9908776 3174 DebrecenMiskolcSzegedPécsBudapest 11. ker.Győr... 9908789 3175 DebrecenMiskolcSzegedPécsBudapest 11. ker.Győr... 9908798 [3176 rows x 2 columns] describe lakos count 3176.000000 mean 3119.898615 std 11263.585339 min 9.000000 25% 345.750000 50% 837.000000 75% 1965.250000 max 204333.000000 Elemi egyedi értékek ['Debrecen' 'Miskolc' 'Szeged' ... 'Tornabarakony' 'Gagyapáti' 'Iborfia'] Értékek száma 3176
# df.rank()
df.sort_values(by='lakos')
df[df['lakos']>10000000]
print(df[1:3])
print('-----------')
print(df.loc[4][0])
print('-----------')
print(df.iloc[2])
print('-----------')
print(df.loc[3][0])
helyseg lakos 1 Miskolc 162905 2 Szeged 161837 ----------- Budapest 11. ker. ----------- helyseg Szeged lakos 161837 Name: 2, dtype: object ----------- Pécs
## Text állományok megnyítása (csv: ,)
user_1 = pd.read_csv("ugyfelcsv1.csv")
user_2 = pd.read_csv("ugyfelcsv2.csv")
# user = pd.read_csv('ugyfelcsv11.txt', sep='\t', lineterminator='\r') ## TAB szeperát
user = pd.read_csv('ugyfelcsv11.txt', sep=';', lineterminator='\r') ## pontosvesszővel szeperát
user
ugyfel_id | vnev | knev | szdatum | nem | |
---|---|---|---|---|---|
0 | 1 | Walter | Gwendolyn | 1954-07-10 | M |
1 | 2 | Armstrong | Kieran | 1932-02-24 | M |
2 | 3 | Kline | Silas | 1938-07-16 | M |
3 | 4 | Gallagher | Rhoda | 1972-10-28 | M |
4 | 5 | Gallagher | Robin | 1940-02-02 | M |
5 | 6 | Frank | Blair | 1977-12-19 | M |
6 | 7 | Cash | Vaughan | 1989-04-06 | M |
7 | 8 | Shields | Charissa | 1926-03-25 | F |
8 | 9 | Brown | Inga | 1942-04-18 | F |
9 | 10 | Crawford | Glenna | 1969-05-14 | F |
# user_1.head() # csak első négy sor megjelenítése
user_1
ugyfel_id | vnev | knev | szdatum | nem | |
---|---|---|---|---|---|
0 | 1 | Walter | Gwendolyn | 1954-07-10 | M |
1 | 2 | Armstrong | Kieran | 1932-02-24 | M |
2 | 3 | Kline | Silas | 1938-07-16 | M |
3 | 4 | Gallagher | Rhoda | 1972-10-28 | M |
4 | 5 | Gallagher | Robin | 1940-02-02 | M |
5 | 6 | Frank | Blair | 1977-12-19 | M |
6 | 7 | Cash | Vaughan | 1989-04-06 | M |
7 | 8 | Shields | Charissa | 1926-03-25 | F |
8 | 9 | Brown | Inga | 1942-04-18 | F |
9 | 10 | Crawford | Glenna | 1969-05-14 | F |
## charset beállítás utánni megnyítás
import codecs
doc = codecs.open('ugyfelcsv11.txt','rU','UTF-8') ## open for reading with "universal" type set
user_1 = pd.read_csv(doc, sep=';')
user_1
ugyfel_id | vnev | knev | szdatum | nem | |
---|---|---|---|---|---|
0 | 1 | Walter | Gwendolyn | 1954-07-10 | M |
1 | 2 | Armstrong | Kieran | 1932-02-24 | M |
2 | 3 | Kline | Silas | 1938-07-16 | M |
3 | 4 | Gallagher | Rhoda | 1972-10-28 | M |
4 | 5 | Gallagher | Robin | 1940-02-02 | M |
5 | 6 | Frank | Blair | 1977-12-19 | M |
6 | 7 | Cash | Vaughan | 1989-04-06 | M |
7 | 8 | Shields | Charissa | 1926-03-25 | F |
8 | 9 | Brown | Inga | 1942-04-18 | F |
9 | 10 | Crawford | Glenna | 1969-05-14 | F |
# user_dada.rename(columns={"ugyfel_id": "ID"}, inplace=True) ## fejléc átnevezése, ha szükséges lenne
user_2.head() ## csak első őt sor
ugyfel_id | igazolvanytipus_id | igazolvanyszam | |
---|---|---|---|
0 | 3 | J | YLHVLF29 |
1 | 4 | J | SIDNEE06 |
2 | 5 | SZ | DUSUNF64 |
3 | 6 | UL | ENBNYK36 |
4 | 7 | UL | PFOTXW50 |
# user_id.rename(columns={"ugyfel_id": "ID"}, inplace=True)
user_2.head(10)
ugyfel_id | igazolvanytipus_id | igazolvanyszam | |
---|---|---|---|
0 | 3 | J | YLHVLF29 |
1 | 4 | J | SIDNEE06 |
2 | 5 | SZ | DUSUNF64 |
3 | 6 | UL | ENBNYK36 |
4 | 7 | UL | PFOTXW50 |
5 | 8 | J | MMRDLZ25 |
6 | 9 | SZ | SKCMWG34 |
7 | 10 | UL | VUKMBG65 |
8 | 11 | SZ | NCGJMG03 |
9 | 12 | SZ | LZQSRL48 |
Két forrás tartalmának automatikus összekapcsolása 0.
Kapcsolás automatikusan a kulcs mező szerint történik
Amikor több táblában is tárolunk adatokat, és előfordulhat olyan, hogy az egyes táblák adatainak önmagában semmilyen értelme nincsen.
A megoldás keresés közben általában előjön, hogy egy másik táblázatban vannak olyan adatok amelyek segítenek az adatok hasznosulásában, de ehez a táblázatokat össze kell kapcsolni, ezt hívjuk merging -nek, azaz összeolvadásnak.
A panda dataframe .merge metódus a közös oszlopokat keresi a paraméterben megadott táblákban, majd ezek után egy új táblában a különböző sorokat ötvözi.
new_df = pd.merge(orders, costumers)
Szerencsére minden DataFrame-nek van merge metódusa, így ha több táblát is össze akarunk olvasztani, akkor ezeket tudjuk láncolatban használni.
new_df = orders.merge(customers).merge(products)
result = pd.merge(user_1, user_2, how='left')
result
ugyfel_id | vnev | knev | szdatum | nem | igazolvanytipus_id | igazolvanyszam | |
---|---|---|---|---|---|---|---|
0 | 1 | Walter | Gwendolyn | 1954-07-10 | M | NaN | NaN |
1 | 2 | Armstrong | Kieran | 1932-02-24 | M | NaN | NaN |
2 | 3 | Kline | Silas | 1938-07-16 | M | J | YLHVLF29 |
3 | 4 | Gallagher | Rhoda | 1972-10-28 | M | J | SIDNEE06 |
4 | 5 | Gallagher | Robin | 1940-02-02 | M | SZ | DUSUNF64 |
5 | 6 | Frank | Blair | 1977-12-19 | M | UL | ENBNYK36 |
6 | 7 | Cash | Vaughan | 1989-04-06 | M | UL | PFOTXW50 |
7 | 8 | Shields | Charissa | 1926-03-25 | F | J | MMRDLZ25 |
8 | 9 | Brown | Inga | 1942-04-18 | F | SZ | SKCMWG34 |
9 | 10 | Crawford | Glenna | 1969-05-14 | F | UL | VUKMBG65 |
## jelőlő bekapcsolása
#print(pd.merge(user_1, user_2, right_index=True, left_index=True).head())
#print('-----------------')
#print(pd.merge(user_1, user_2, how='left', suffixes=('_left', '_right')).head())
pd.merge(user_1, user_2, right_index=True, left_index=True).head()
ugyfel_id_x | vnev | knev | szdatum | nem | ugyfel_id_y | igazolvanytipus_id | igazolvanyszam | |
---|---|---|---|---|---|---|---|---|
0 | 1 | Walter | Gwendolyn | 1954-07-10 | M | 3 | J | YLHVLF29 |
1 | 2 | Armstrong | Kieran | 1932-02-24 | M | 4 | J | SIDNEE06 |
2 | 3 | Kline | Silas | 1938-07-16 | M | 5 | SZ | DUSUNF64 |
3 | 4 | Gallagher | Rhoda | 1972-10-28 | M | 6 | UL | ENBNYK36 |
4 | 5 | Gallagher | Robin | 1940-02-02 | M | 7 | UL | PFOTXW50 |
result = pd.merge(user_1,
user_2[['ugyfel_id', 'igazolvanyszam']], ## hozzáfűzési mezők, az első a kulcs mező
on='ugyfel_id', ## kulcs mező a kapcsoláshoz (azonos nevüek legyenek)
how='left', ## Kapcsolat módja (left, right, outer, inner)
indicator=True ## jelző újmezőben megjelenítése
)
result.head(10)
ugyfel_id | vnev | knev | szdatum | nem | igazolvanyszam | _merge | |
---|---|---|---|---|---|---|---|
0 | 1 | Walter | Gwendolyn | 1954-07-10 | M | NaN | left_only |
1 | 2 | Armstrong | Kieran | 1932-02-24 | M | NaN | left_only |
2 | 3 | Kline | Silas | 1938-07-16 | M | YLHVLF29 | both |
3 | 4 | Gallagher | Rhoda | 1972-10-28 | M | SIDNEE06 | both |
4 | 5 | Gallagher | Robin | 1940-02-02 | M | DUSUNF64 | both |
5 | 6 | Frank | Blair | 1977-12-19 | M | ENBNYK36 | both |
6 | 7 | Cash | Vaughan | 1989-04-06 | M | PFOTXW50 | both |
7 | 8 | Shields | Charissa | 1926-03-25 | F | MMRDLZ25 | both |
8 | 9 | Brown | Inga | 1942-04-18 | F | SKCMWG34 | both |
9 | 10 | Crawford | Glenna | 1969-05-14 | F | VUKMBG65 | both |
Nézzük egy érték vizsgálatot.
print("user_1 shape: {}".format(user_1.shape))
print("user_2 shape: {}".format(user_2.shape))
user_1 dimensions: (10, 5) user_2 dimensions: (10, 3)
# Azonositó benn foglalás ellenőrzése
user_1['ugyfel_id'].isin(user_2['ugyfel_id']).value_counts()
True 8 False 2 Name: ugyfel_id, dtype: int64
result = pd.merge(user_1,
user_2[['igazolvanytipus_id', 'ugyfel_id']], ## hozzáfűzési mezők // nem az első a kulcs mező
left_on='ugyfel_id', right_on='ugyfel_id', ## kulcs mezők konkrét megadása a kapcsoláshoz (eltérő nevüek)
how='outer', ## Kapcsolat módja left
indicator=True ## jelző újmezőben megjelenítése
)
result.head(12) ## első 12 sor megjelenítése (most összesen ennyi van)
ugyfel_id | vnev | knev | szdatum | nem | igazolvanytipus_id | _merge | |
---|---|---|---|---|---|---|---|
0 | 1 | Walter | Gwendolyn | 1954-07-10 | M | NaN | left_only |
1 | 2 | Armstrong | Kieran | 1932-02-24 | M | NaN | left_only |
2 | 3 | Kline | Silas | 1938-07-16 | M | J | both |
3 | 4 | Gallagher | Rhoda | 1972-10-28 | M | J | both |
4 | 5 | Gallagher | Robin | 1940-02-02 | M | SZ | both |
5 | 6 | Frank | Blair | 1977-12-19 | M | UL | both |
6 | 7 | Cash | Vaughan | 1989-04-06 | M | UL | both |
7 | 8 | Shields | Charissa | 1926-03-25 | F | J | both |
8 | 9 | Brown | Inga | 1942-04-18 | F | SZ | both |
9 | 10 | Crawford | Glenna | 1969-05-14 | F | UL | both |
10 | 11 | NaN | NaN | NaN | NaN | SZ | right_only |
11 | 12 | NaN | NaN | NaN | NaN | SZ | right_only |
result = pd.merge(user_1, user_2, on='ugyfel_id', how='left', suffixes=('_left', '_right'))
result.head(12)
ugyfel_id | vnev | knev | szdatum | nem | igazolvanytipus_id | igazolvanyszam | |
---|---|---|---|---|---|---|---|
0 | 1 | Walter | Gwendolyn | 1954-07-10 | M | NaN | NaN |
1 | 2 | Armstrong | Kieran | 1932-02-24 | M | NaN | NaN |
2 | 3 | Kline | Silas | 1938-07-16 | M | J | YLHVLF29 |
3 | 4 | Gallagher | Rhoda | 1972-10-28 | M | J | SIDNEE06 |
4 | 5 | Gallagher | Robin | 1940-02-02 | M | SZ | DUSUNF64 |
5 | 6 | Frank | Blair | 1977-12-19 | M | UL | ENBNYK36 |
6 | 7 | Cash | Vaughan | 1989-04-06 | M | UL | PFOTXW50 |
7 | 8 | Shields | Charissa | 1926-03-25 | F | J | MMRDLZ25 |
8 | 9 | Brown | Inga | 1942-04-18 | F | SZ | SKCMWG34 |
9 | 10 | Crawford | Glenna | 1969-05-14 | F | UL | VUKMBG65 |
#df['col_2'].apply(lambda x : x * 2)
#user_1['UJ_UF_ID'].apply(lambda x : x * 2)
#szdatum
#new = user_1["szdatum"].str.split("-", n = 1, expand = True) ## csak egy vágás
new = user_1["szdatum"].str.split("-", expand = True)
user_1['EV']= new[0] ## új mező létrehozása, ha még nincs
user_1['HO']= new[1] ## új mező létrehozása, ha még nincs
user_1['NAP']= new[2] ## új mező létrehozása, ha még nincs
user_1
ugyfel_id | vnev | knev | szdatum | nem | EV | HO | NAP | |
---|---|---|---|---|---|---|---|---|
0 | 1 | Walter | Gwendolyn | 1954-07-10 | M | 1954 | 07 | 10 |
1 | 2 | Armstrong | Kieran | 1932-02-24 | M | 1932 | 02 | 24 |
2 | 3 | Kline | Silas | 1938-07-16 | M | 1938 | 07 | 16 |
3 | 4 | Gallagher | Rhoda | 1972-10-28 | M | 1972 | 10 | 28 |
4 | 5 | Gallagher | Robin | 1940-02-02 | M | 1940 | 02 | 02 |
5 | 6 | Frank | Blair | 1977-12-19 | M | 1977 | 12 | 19 |
6 | 7 | Cash | Vaughan | 1989-04-06 | M | 1989 | 04 | 06 |
7 | 8 | Shields | Charissa | 1926-03-25 | F | 1926 | 03 | 25 |
8 | 9 | Brown | Inga | 1942-04-18 | F | 1942 | 04 | 18 |
9 | 10 | Crawford | Glenna | 1969-05-14 | F | 1969 | 05 | 14 |
user_1["kisbetus_neve"] = user_1.vnev.apply(str.lower) ## új mező létrehozása, ha még nincs
user_1["idx2"] = user_1.ugyfel_id.apply(lambda x : x * 2) ## új mező létrehozása, ha még nincs
## user_1.drop('Lowercase Name', axis=1, inplace=True) ## oszlop/mező törlése
user_1
ugyfel_id | vnev | knev | szdatum | nem | EV | HO | NAP | kisbetus_neve | idx2 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Walter | Gwendolyn | 1954-07-10 | M | 1954 | 07 | 10 | walter | 2 |
1 | 2 | Armstrong | Kieran | 1932-02-24 | M | 1932 | 02 | 24 | armstrong | 4 |
2 | 3 | Kline | Silas | 1938-07-16 | M | 1938 | 07 | 16 | kline | 6 |
3 | 4 | Gallagher | Rhoda | 1972-10-28 | M | 1972 | 10 | 28 | gallagher | 8 |
4 | 5 | Gallagher | Robin | 1940-02-02 | M | 1940 | 02 | 02 | gallagher | 10 |
5 | 6 | Frank | Blair | 1977-12-19 | M | 1977 | 12 | 19 | frank | 12 |
6 | 7 | Cash | Vaughan | 1989-04-06 | M | 1989 | 04 | 06 | cash | 14 |
7 | 8 | Shields | Charissa | 1926-03-25 | F | 1926 | 03 | 25 | shields | 16 |
8 | 9 | Brown | Inga | 1942-04-18 | F | 1942 | 04 | 18 | brown | 18 |
9 | 10 | Crawford | Glenna | 1969-05-14 | F | 1969 | 05 | 14 | crawford | 20 |
Több hasonló tábla összefűzése
Ha az adatok, amelyek hasonlóak, akár több táblában vannak tárolva, akkor azok beolvasása egy közös táblába is lehetséges, így a közös elemzés is elvégezhető.
pd.concat([df1, df2])
Mivel viszik magukkal az azonosítójukat, szükséges az összefűzés után a reset_index() mely létrehoz egy új indexelést.
print("Összesen van {} sorunk, amelyben nem szerepel egy oszlopban sem nulla.".format(
(result.apply(lambda x: x.isnull().sum(), axis=1) == 0).sum()))
print("Hiányzó adat {} szor fordul elő az 'igazolvanytipus_id' mezőben.".format(
result['igazolvanytipus_id'].isnull().sum()))
Összesen van 8 sorunk, amelyben nem szerepel egy oszlopban sem nulla. Hiányzó adat 2 szor fordul elő az 'igazolvanytipus_id' mezőben.
user_1[user_1.nem == 'F'] ## Nők megjelenitése csak azok amelyek a nem mezőben F -et tartalmaznak
ugyfel_id | vnev | knev | szdatum | nem | |
---|---|---|---|---|---|
7 | 8 | Shields | Charissa | 1926-03-25 | F |
8 | 9 | Brown | Inga | 1942-04-18 | F |
9 | 10 | Crawford | Glenna | 1969-05-14 | F |
user_1[user_1.vnev.str.startswith('Ga')] ## Ga vnev kezdettel rendelkezők listázása
ugyfel_id | vnev | knev | szdatum | nem | |
---|---|---|---|---|---|
3 | 4 | Gallagher | Rhoda | 1972-10-28 | M |
4 | 5 | Gallagher | Robin | 1940-02-02 | M |
user_1[(user_1.nem == 'F') & (user_1.vnev.str.startswith('Br'))] ## többszörös feltétel
ugyfel_id | vnev | knev | szdatum | nem | |
---|---|---|---|---|---|
8 | 9 | Brown | Inga | 1942-04-18 | F |
## Hányan vannak a nők és a férfiak és milyen idősek a legfiatalabbak
user_1.groupby("nem").agg({
"szdatum": "min", ## mean, max, ..
"knev": "count"
})
szdatum | knev | |
---|---|---|
nem | ||
F | 1926-03-25 | 3 |
M | 1932-02-24 | 7 |
- Link lekérése
- X
- Más alkalmazások
- Link lekérése
- X
- Más alkalmazások
Megjegyzések
Megjegyzés küldése