Wednesday, 28 December 2016

[pandas] Truy cập nội dung DataFrame

Bài trước đã hướng dẫn các khái niệm cơ bản và cách tạo một bảng dữ liệu bằng pandas.
Bài này sẽ hướng dẫn cách xem bất cứ phần nào ta muốn trong bảng (DataFrame) đã tạo.

Tạo bảng mới

In [1]: import pandas as pd
In [4]: import numpy as np
In [5]: dates = pd.date_range('20161212', periods=6)
In [6]: df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
In [7]:  df
Out[7]:
                   A         B         C         D
2016-12-12 -0.115304 -0.400382  1.254944  0.702264
2016-12-13  1.436155  0.476939  1.334369  0.223856
2016-12-14 -0.124606 -0.017318  0.824345 -0.432029
2016-12-15 -1.013802  0.266865  1.341752 -0.990876
2016-12-16  0.669347 -1.086764  0.555358 -0.579439
2016-12-17 -0.405407 -0.044016 -0.153047 -0.800809

Truy cập hàng và cột trong bảng

Lấy danh sách tên các cột (column)

In [60]: df.columns
Out[60]: Index(['A', 'B', 'C', 'D'], dtype='object')

Lấy danh sách tên các dòng (index)

In [61]: df.index
Out[61]:
DatetimeIndex(['2016-12-12', '2016-12-13', '2016-12-14', '2016-12-15',
               '2016-12-16', '2016-12-17'],
              dtype='datetime64[ns]', freq='D')

Lấy dữ liệu trong bảng

In [62]: df.values
Out[62]:
array([[-0.11530425, -0.40038169,  1.25494416,  0.70226436],
       [ 1.43615505,  0.47693927,  1.33436851,  0.22385577],
       [-0.12460608, -0.0173181 ,  0.82434486, -0.4320285 ],
       [-1.01380199,  0.26686462,  1.34175163, -0.99087559],
       [ 0.66934672, -1.08676379,  0.55535794, -0.57943899],
       [-0.40540728, -0.04401589, -0.15304738, -0.80080895]])

Lấy từng cột và từng hàng

pandas hỗ trợ truy cập theo 2 cách:
- theo label (tên các index, tên cột): sử dụng loc và at
- theo số thứ tự (chỉ số bắt đầu từ 0): sử dụng iloc và iat
- các function này nhận các argument đầu vào lần lượt là hàng, cột.

Lấy một ô cụ thể

at (trong tiếng Việt nghĩa là : ở) - chỉ dùng để lấy 1 giá trị (1 ô trong bảng). Lấy ô đầu tiên trong bảng, sử dụng label. Tức ngày đầu tiên (hàng) và column A (cột):
In [41]: df.at[dates[0], 'A']
Out[41]: -0.11530424537901704
hoặc truy cập bằng vị trí (position): đây là ô đầu tiên, cột đầu tiên.
Chú ý:

Trên Python, thứ tự luôn đếm từ 0

In [42]: df.iat[0, 0]
Out[42]: -0.11530424537901704
Giá trị nằm trong ô này là một số - hay gọi là đại lượng vô hướng (scalar).

Lấy toàn bộ các dòng trong cột

Dùng label của column lấy cột B, truy cập "attribute" B của object df :
In [50]: df.B
Out[50]:
2016-12-12   -0.400382
2016-12-13    0.476939
2016-12-14   -0.017318
2016-12-15    0.266865
2016-12-16   -1.086764
2016-12-17   -0.044016
Freq: D, Name: B, dtype: float64
Lấy dòng thứ 2 (chỉ số là 1) của cột B:
In [65]: df.B[1]
Out[65]: 0.47693926863267544
Hoặc truy cập theo cú pháp DataFrame['TÊN CỘT']:
In [68]: df['B']
Out[68]:
2016-12-12   -0.400382
2016-12-13    0.476939
2016-12-14   -0.017318
2016-12-15    0.266865
2016-12-16   -1.086764
2016-12-17   -0.044016
Freq: D, Name: B, dtype: float64
Ưu điểm của cách làm thứ 2 này là có thể truy cập các cột có tên là ký tự đặc biệt - không trong bảng chứ cái tiếng Anh. Nếu cột nào tên là "họ và tên", ta có thể truy cập bằng: df['họ và tên'].
😘 Cám ơn HTL đã chỉ ra điều này.

Truy cập theo hàng và giới hạn kết quả theo cột

Lấy toàn bộ hàng thứ 2 theo label:
In [51]: df.loc[dates[1]]
Out[51]:
A    1.436155
B    0.476939
C    1.334369
D    0.223856
Name: 2016-12-13 00:00:00, dtype: float64
Lấy toàn bộ hàng thứ 2 theo vị trí:
In [52]: df.iloc[1]
Out[52]:
A    1.436155
B    0.476939
C    1.334369
D    0.223856
Name: 2016-12-13 00:00:00, dtype: float64
Lấy hàng 2 (chỉ số 1), cột 3 (chỉ số 2):
In [53]: df.iloc[1, 2]
Out[53]: 1.3343685138882
hay lấy ô ứng với ngày 2016-12-13 cột C:
In [54]: dates[1]
Out[54]: Timestamp('2016-12-13 00:00:00', freq='D')

In [55]: df.loc[dates[1], 'C']
Out[55]: 1.3343685138882
Lấy hàng ứng với ngày đầu tiên (dòng 0), sau đó chỉ chọn cột A và B (cột 0, 1):

In [56]: df.loc[dates[0], ['A', 'B']]
Out[56]:
A   -0.115304
B   -0.400382
Name: 2016-12-12 00:00:00, dtype: float64

In [57]: df.iloc[0, [0, 1]]
Out[57]:
A   -0.115304
B   -0.400382
Name: 2016-12-12 00:00:00, dtype: float64

Hết.
Tham khảo: http://pandas.pydata.org/pandas-docs/stable/10min.html

HVN at http://www.familug.org/ and http://pymi.vn