Tổng số lượt xem trang

Thứ Sáu, 2 tháng 6, 2017

Pandas



Cùng với Matplotlib và Numpy, Pandas là một trong những thư viện được dùng rộng rãi cùng Python. Có thể khẳng định, đó là bộ 3 chúng ta buộc phải biết, thậm chí dùng thành thạo, khi viết các chương trình Python.  Pandas cung cấp nhiều đối tượng và phương thức cho các cấu trúc dữ liệu. Pandas là thư viện không thể thiếu cho chúng ta trong suốt quá trình xử lý dữ liệu (data munging): từ chuyển đổi hay ánh xạ dữ liệu thô sang dạng dữ liệu mà chúng ta mong muốn, nhằm có thể phân tích dễ dàng hơn.



      Chúng ta sẽ tập trung vào hai cấu trúc dữ liệu hiệu quả được dùng trong Python: SeriesDataFrame; cả hai cấu trúc này được xây trên thư viện Numpy.
Series
Là một đối tượng tương tự như mảng một chiều, hay như một cột của một bảng. Mặc định, mỗi phần tử trong item sẽ được gán chỉ số (index) từ 0 tới N-1, trong đó N là số phần tử của series.
import pandas as pd
# Tạo ra một series với một list bất kì
s = pd.Series(['Nguyen Van Hau', 3.14, -11012017, 'Happy New Year!'])
print (type(s))
print (s)
<class 'pandas.core.series.Series'>
0     Nguyen Van Hau
1               3.14
2          -11012017
3    Happy New Year!
dtype: object
      Chúng ta cũng có thể tạo ra các chỉ số cho các phần tử:
s = pd.Series(['Nguyen Van Hau', 3.14, -11012017, 'Happy New Year!'], index=['B', 'O', 'N', 'G'])
B     Nguyen Van Hau
O               3.14
N          -11012017
G    Happy New Year!
 
bienXe = [29, 89, 34, 15, 52, 99, 98, 43, 18, 17]
cities = pd.Series(bienXe)
print (cities1)

0    29
1    89
2    34
3    15
4    52
5    99
6    98
7    43
8    18
9    17

      Chúng ta có thể chỉ định index trong series bằng cách tạo hai list, một cho index và một cho các phần tử:
bienXe = [29, 89, 34, 15, 52, 99, 98, 43, 18, 17]

thanhPho = ['Hanoi', 'Hung Yen', 'Hai Duong', 'Hai Phong',

     'TPHCM', 'Bac Ninh', 'Bac Giang', 'Da Nang', 'Nam Dinh', 'Thai Binh']

cities = pd.Series(bienXe, thanhPho)
print (cities)
Hanoi        29
Hung Yen     89
Hai Duong    34
Hai Phong    15
TPHCM        52
Bac Ninh     99
Bac Giang    98
Da Nang      43
Nam Dinh     18
Thai Binh    17
      Chúng ta cũng có thể tạo series từ một dictionary, khi đó key sẽ đóng vai trò là index trong series:
import pandas as pd

d = {'Hanoi': 29, 'Hung Yen': 89, 'Hai Duong': 34, 'Hai Phong': 15,

     'TPHCM': 52, 'Bac Ninh': 99, 'Bac Giang': 98, 'Da Nang': 43, 'Nam Dinh':18, 'Thai Binh': 17}

cities = pd.Series(d)

  print (cities)
Bac Giang    98
Bac Ninh     99
Da Nang      43
Hai Duong    34
Hai Phong    15
Hanoi        29
Hung Yen     89
Nam Dinh     18
TPHCM        52
Thai Binh    17

Hiển thị thông tin trong Series:
print (cities.head())
Bac Giang    98
Bac Ninh     99
Da Nang      43
Hai Duong    34
Hai Phong    15
In ra chỉ số series
print (cities.index)

Index([u'Bac Giang', u'Bac Ninh', u'Da Nang', u'Hai Duong', u'Hai Phong',
       u'Hanoi', u'Hung Yen', u'Nam Dinh', u'TPHCM', u'Thai Binh'],
      dtype='object')

Hiển thị thông tin mô tả về dữ liệu (count – số hàng, max  – giá trị lớn nhất, min – giá trị nhỏ nhất, mean – trung bình, v.v...):
print cities.describe()

count    10.000000
mean     49.400000
std      33.846713
min      15.000000
25%      20.750000
50%      38.500000
75%      79.750000
max      99.000000

      Hiển thị thông tin tính tổng:
total = 0
for item in cities:
    total+=item

print(total)
494
      Hoặc chúng ta có thể dùng hàm:
print cities.sum()
494
      Tính chiều dài của một dữ liệu trong series:
print len(cities)
10

Truy vấn trong Series:
      Chúng ta có thể truy xuất tới phần tử thông qua các chỉ số:
print (cities['Hung Yen'])
89.0
print (cities[['Hung Yen', 'Hai Duong']])
Hung Yen     89
Hai Duong    34
      Hoặc có thể dùng hàm series.iloc[số-thứ-tự-hàng]
print (cities.iloc[5])
29
      Chúng ta cũng có thể dùng truy vấn trực tiếp tới số thứ tự hàng. Nhưng cẩn thận khi các index cũng là các số tự nhiên. Không nên dùng!
print (cities[5])
29
      Chúng ta cũng có thể dùng phép toán bool làm index:
print (cities[cities > 50])

Bac Giang    98
Bac Ninh     99
Hung Yen     89
TPHCM        52

Thay đổi dữ liệu trong Series
Chúng ta có thể thao tác cho toàn bộ dữ liệu dễ dàng:
cities_1 = cities-10
print (cities_1)

Bac Giang    88
Bac Ninh     89
Da Nang      33
Hai Duong    24
Hai Phong     5
Hanoi        19
Hung Yen     79
Nam Dinh      8
TPHCM        42
Thai Binh     7
      Chúng ta cũng có thể thay đổi giá trị phần tử trong series:
print (cities['TPHCM'])
cities['TPHCM'] = 53print (cities['TPHCM'])

52.0
53.0

DataFrame
Là một cấu trúc dữ liệu dạng bảng, gồm hàng (index – chỉ số) và cột (name - tên). Chúng ta có thể coi DataFrame là một nhóm các đối tượng Series cùng với các index.
Khởi tạo một DataFrame
Chúng ta có thể đọc từ một tệp định dạng csv:
import pandas as pd
import os

duongDan = os.getcwd() + '\data\iris.data.csv'
tenCot = ['sepal length', 'sepal width', 'petal length', 'petal width', 'class']
duLieu = pd.read_csv(duongDan, names=tenCot)

print (type(duLieu))
<class 'pandas.core.frame.DataFrame'>
Dùng dictionary của các list cho tham số truyền vào, và key của dictionary chính là các index cho DataFrame:
import pandas as pd

data = 
{'year': [2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016],

'team': ['Barca','Inter','Barca','Chelsea','Bayern','Real','Barca','Real'],

'players':['Messi','Messi','Messi','Messi','Ronaldo','Ronaldo','Neymar','Ronaldo'],

'goals': [9, 8, 12, 14, 12, 17, 10, 16]}

football = pd.DataFrame(data)
print (football)

Chúng ta được DataFrame như sau:
      year     team  players    goals
0  2009    Barca    Messi      9
1  2010    Inter    Messi      8
2  2011    Barca    Messi     12
3  2012  Chelsea    Messi     14
4  2013   Bayern  Ronaldo     12
5  2014     Real  Ronaldo     17
6  2015    Barca   Neymar     10
7  2016     Real  Ronaldo     16
DataFrame cũng có thể xây dựng từ các Series:
import pandas as pd

item1 = pd.Series({'Name': 'Hau',
                        'Book1': 'Machine Learning',
                        'Book2': 'Data Mining',
                        'Cost': 22.50})

item2 = pd.Series({'Name': 'M.Quy',
                        'Book1': 'Parallel Computing',
                        'Book2': 'Software Engineering',
                        'Cost': 24.10})

item3 = pd.Series({ 'Name': 'Dong',
                        'Book1': 'Rough Set',
                        'Book2': 'Big Data',
                        'Cost': 32.40})

item4 = pd.Series({'Name': 'Nang',
                        'Book1': 'NLP',
                        'Book2': 'Data Mining',
                        'Cost': 28.00})

item5 = pd.Series({'Name': 'Diep',
                        'Book1': 'Machine Learning',
                        'Book2': 'Parallel Computing',
                        'Cost': 34.00})

item6 = pd.Series({'Name': 'Trang',
                        'Book1': 'Software Testing',
                        'Book2': 'Machine Learning',
                        'Cost': 42.00})

item7 = pd.Series({'Name': 'Hue',
                        'Book1': 'Python Programming',
                        'Book2': 'Big Data',
                        'Cost': 42.00})

df = pd.DataFrame([item1, item2, item3, item4, item5, item6, item7], 
index=['Amazon', 'Dinh Le', 'Amazon', 'Dinh Le', 'Ebay', 'Alibaba', 'Amazon'])print (df)
                      Book1                 Book2  Cost   Name
Amazon     Machine Learning           Data Mining  22.5    Hau
Dinh Le  Parallel Computing  Software Engineering  24.1    M.Quy
Amazon            Rough Set              Big Data  32.4   Dong
Dinh Le                 NLP           Data Mining  28.0   Nang
Ebay       Machine Learning    Parallel Computing  34.0   Diep
Alibaba    Software Testing      Machine Learning  42.0  Trang
Amazon   Python Programming              Big Data  42.0    Hue


Hiển thị thông tin trong DataFrame:
Chúng ta cũng có thể dùng các lệnh hiển thị dữ liệu, như đã làm với Series:
print (df.head(3))
Hiển thị ra 3 hàng đầu:
                      Book1                 Book2  Cost  Name
Amazon     Machine Learning           Data Mining  22.5   Hau
Dinh Le  Parallel Computing  Software Engineering  24.1   M.Quy
Amazon            Rough Set              Big Data  32.4  Dong
print (df.tail(2))
Hiển thị ra 2 dòng cuối:
                      Book1             Book2  Cost   Name
Alibaba    Software Testing  Machine Learning  42.0  Trang
Amazon   Python Programming          Big Data  42.0    Hue

Truy vấn dữ liệu trong DataFrame:

Có 2 kiểu truy vấn dữ liệu thường dùng:
·         DataFrame[‘tên-cột’]: trả ra là một Series
·         DataFrame.loc[‘tên-hàng’] (tên hàng – chỉ số index): trả ra một DataFrame
·         DataFrame.iloc(số-hàng): trả ra là một Series
·         DataFrame.iloc[số-hàng] [‘tên-cột’]: trả ra một phần tử của dữ liệu

print df['Name']
Amazon       Hau
Dinh Le    M.Quy
Amazon      Dong
Dinh Le     Nang
Ebay        Diep
Alibaba    Trang
Amazon       Hue
Chúng ta xem những ai đã mua sách ở ‘Amazon’:
print (df.loc['Amazon'])
                     Book1        Book2  Cost  Name
Amazon    Machine Learning  Data Mining  22.5   Hau
Amazon           Rough Set     Big Data  32.4  Dong
Amazon  Python Programming     Big Data  42.0   Hue

Chúng ta xem những ai đã mua sách ở ‘Amazon’ và tên người mua:
print (df.loc['Amazon']['Name'])
Amazon     Hau
Amazon    Dong
Amazon     Hue
Chúng ta muốn hiển thị tất cả các hàng dữ liệu nhưng chỉ với cột ‘Name’ :
print (df.loc[:,['Name']])
          Name
Amazon     Hau
Dinh Le    M.Quy
Amazon    Dong
Dinh Le   Nang
Ebay      Diep
Alibaba  Trang
Amazon     Hue
Chúng ta muốn xem hàng dữ liệu thứ 3:
print (df.iloc[3])
Book1            NLP
Book2    Data Mining
Cost              28
Name            Nang
Chúng ta muốn xem hàng dữ liệu thứ 3, mua cuốn Book2 là gì:
print (df.iloc[3]['Book1'])
Data Mining


Thao tác dữ liệu trong DataFrame:
Rất nhiều lúc chúng ta cần sao lưu một DataFrame. Trong trường hợp này chúng ta muốn xóa đi một index:
copy_df = df.copy()
copy_df = copy_df.drop('Amazon')
print (copy_df)
                      Book1                 Book2  Cost   Name
Dinh Le  Parallel Computing  Software Engineering  24.1  M.Quy
Dinh Le                 NLP           Data Mining  28.0   Nang
Ebay       Machine Learning    Parallel Computing  34.0   Diep
Alibaba    Software Testing      Machine Learning  42.0  Trang
Chúng ta có thể xóa một cột:
del copy_df['Book2']
print (copy_df)
                      Book1  Cost   Name
Dinh Le  Parallel Computing  24.1  M.Quy
Dinh Le                 NLP  28.0   Nang
Ebay       Machine Learning  34.0   Diep
Alibaba    Software Testing  42.0  Trang
Thiết lập giá trị cho cả một cột dữ liệu :
copy_df['Cost'] = 12.0
print (copy_df)
                      Book1  Cost   Name
Dinh Le  Parallel Computing  12.0  M.Quy
Dinh Le                 NLP  12.0   Nang
Ebay       Machine Learning  12.0   Diep
Alibaba    Software Testing  12.0  Trang
Chèn một cột dữ liệu mới vào :
df.insert(3,'Currency',21000)
print (df)
Câu lệnh trên chèn cột mới vào vị trí cột thứ 3, có tên là ‘Currency’, tất cả có giá trị 21000:
                      Book1                 Book2  Cost  Currency   Name
Amazon     Machine Learning           Data Mining  22.5     21000    Hau
Dinh Le  Parallel Computing  Software Engineering  24.1     21000  M.Quy
Amazon            Rough Set              Big Data  32.4     21000   Dong
Dinh Le                 NLP           Data Mining  28.0     21000   Nang
Ebay       Machine Learning    Parallel Computing  34.0     21000   Diep
Alibaba    Software Testing      Machine Learning  42.0     21000  Trang
Amazon   Python Programming              Big Data  42.0     21000    Hue

Còn rất nhiều các thao tác hữu ích của pandas trên cơ sở dữ liệu như: Querying, Joining (left', 'right', 'outer', 'inner'), Combining, Grouping. Nhờ những kĩ thuật này mà những thao tác trên DataFrame tương đương với các câu lệnh cơ bản của SQL trên cơ sở dữ liệu quan hệ. Bạn đọc có thể tham khảo [1-5].

Tài liệu tham khảo:

1 nhận xét:

maidocvalis nói...

MGM National Harbor Casino - Mapyro
The casino is located in the Marina District 평택 출장샵 on the west 경상남도 출장안마 side of the casino. The casino has 37 계룡 출장마사지 tables in all of the venues, including the MGM Address: 3100 S Las Vegas Blvd, Las 수원 출장마사지 Vegas, NV 89109Phone: 702-770-6305 의정부 출장샵