Pandas là một gói Python phổ biến dành cho khoa học dữ liệu và với lý do chính đáng: nó cung cấp các cấu trúc dữ liệu linh hoạt, biểu cảm và mạnh mẽ giúp thao tác và phân tích dữ liệu trở nên dễ dàng, trong số nhiều thứ khác. DataFrame là một trong những cấu trúc này.
DataFrames Pandas là gì?
Trước khi bạn bắt đầu, hãy tóm tắt ngắn gọn về DataFrames là gì.
Những người quen thuộc với R biết dataframes như một cách để lưu trữ dữ liệu trong lưới hình chữ nhật có thể dễ dàng tổng quan. Mỗi hàng của các lưới này tương ứng với các phép đo hoặc giá trị của một thực thể, trong khi mỗi cột là một vectơ chứa dữ liệu cho một biến cụ thể. Điều này có nghĩa là các hàng của dataframes không cần chứa, nhưng có thể chứa, cùng loại giá trị: chúng có thể là số, ký tự, logic, v.v.
Bây giờ, DataFrames trong Python rất giống nhau: chúng đi kèm với thư viện Pandas và chúng được định nghĩa là cấu trúc dữ liệu được gắn nhãn hai chiều với các cột có thể có các loại khác nhau.
Các bài viết liên quan:
Nói chung, bạn có thể nói rằng DataFrame của Pandas bao gồm ba thành phần chính: dữ liệu, index và các column.
Đầu tiên, DataFrame có thể chứa dữ liệu:
- 1 dataframes Pandas
- 1 Pandas Series: một mảng có nhãn một chiều có khả năng chứa bất kỳ loại dữ liệu nào có nhãn trục hoặc chỉ mục. Một ví dụ về đối tượng Sê-ri là một cột từ DataFrame.
- 1 NumPy ndarray, có thể là một bản ghi hoặc có cấu trúc
- 1 ndarray hai chiều
- Từ điển của ndarray ndarray , lists, dictionaries hoặc Series.
Lưu ý sự khác biệt giữa np.ndarray và np.array() . Cái trước là một kiểu dữ liệu thực tế, trong khi cái sau là một hàm để tạo mảng từ các cấu trúc dữ liệu khác.
Mảng có cấu trúc cho phép người dùng thao tác dữ liệu theo các trường được đặt tên: trong ví dụ bên dưới, một mảng có cấu trúc gồm ba bộ được tạo. Phần tử đầu tiên của mỗi bộ sẽ được gọi là foo và sẽ có kiểu int, trong khi phần tử thứ hai sẽ được đặt tên là bar và sẽ là một float.
Mảng ghi, mặt khác, mở rộng các thuộc tính của mảng có cấu trúc. Chúng cho phép người dùng truy cập các trường của mảng có cấu trúc theo thuộc tính thay vì theo chỉ mục. Bạn thấy bên dưới rằng các giá trị foo được truy cập trong mảng bản ghi r2.
Một ví dụ:
#sử dụng thư viện pandas và numpy import pandas as pd import numpy as np # Mảng có cấu trúc my_array = np.ones(3, dtype=([('foo', int), ('bar', float)])) # In mảng có cấu trúc print(my_array['foo']) # Một mảng bản ghi my_array2 = my_array.view(np.recarray) # In mảng bản ghi print(my_array2.foo)
Bên cạnh dữ liệu, bạn cũng có thể chỉ định tên index và cột cho DataFrame của mình. Một mặt, index biểu thị sự khác biệt trong các hàng, trong khi tên column biểu thị sự khác biệt trong các cột. Sau này, bạn sẽ thấy rằng hai thành phần này của DataFrame sẽ có ích khi bạn thao tác với dữ liệu của mình.
Nếu bạn vẫn còn nghi ngờ về Pandas DataFrames và cách chúng khác với các cấu trúc dữ liệu khác, chẳng hạn như mảng NumPy hoặc Sê-ri.
Thư viện Pandas thường được nhập dưới bí danh pd, trong khi thư viện NumPy được tải dưới dạng np. Hãy nhớ rằng khi bạn viết mã trong môi trường khoa học dữ liệu của riêng mình, bạn không nên quên bước nhập này, bạn viết như sau:
import numpy as np import pandas as pd
Giờ đây, bạn không còn nghi ngờ gì nữa về DataFrames là gì, chúng có thể làm gì và chúng khác với các cấu trúc khác như thế nào, đã đến lúc giải quyết những câu hỏi phổ biến nhất mà người dùng có về cách làm việc với chúng!
Cách tạo dataframes Pandas
Rõ ràng, tạo DataFrames là bước đầu tiên của bạn trong hầu hết mọi thứ bạn muốn làm khi trộn dữ liệu trong Python. Đôi khi, bạn sẽ muốn bắt đầu lại từ đầu, nhưng bạn cũng có thể chuyển đổi các cấu trúc dữ liệu khác, chẳng hạn như danh sách hoặc mảng NumPy, sang Pandas DataFrames. Trong phần này, bạn sẽ chỉ đề cập đến phần sau.
Trong số nhiều thứ có thể đóng vai trò là đầu vào để tạo ‘dataframes’, NumPy ndarray là một trong số đó. Để tạo một dataframes từ một mảng NumPy, bạn chỉ cần chuyển nó tới hàm DataFrame() trong đối số dữ liệu.
#khởi tạo array data = np.array([['','Col1','Col2'], ['Row1',1,2], ['Row2',3,4]]) #khởi tạo dataframe với đầu vào array print(pd.DataFrame(data=data[1:,1:], index=data[1:,0], columns=data[0,1:]))
Hãy chú ý đến cách đoạn mã ở trên chọn các phần tử từ mảng NumPy để xây dựng DataFrame: trước tiên, bạn chọn các giá trị có trong danh sách bắt đầu bằng Hàng1 và Hàng2, sau đó bạn chọn chỉ mục hoặc số hàng Row1 và Row2, rồi sau đó tên cột Col1 và Col2.
Tiếp theo, bạn cũng thấy rằng, trong ví dụ trên, chúng tôi đã in một vùng dữ liệu nhỏ. Điều này hoạt động tương tự như việc sắp xếp lại các mảng 2D NumPy: trước tiên bạn chỉ ra hàng mà bạn muốn tìm kiếm dữ liệu của mình, sau đó là cột. Đừng quên rằng các chỉ số bắt đầu từ 0! Đối với dữ liệu trong ví dụ trên, bạn đi và tìm trong các hàng từ chỉ mục 1 đến cuối và bạn chọn tất cả các phần tử đứng sau chỉ mục. Kết quả là bạn chọn 1, 2, 3 và 4.
Cách tiếp cận này để tạo DataFrames sẽ giống nhau đối với tất cả các cấu trúc mà DataFrame() có thể đảm nhận làm đầu vào.
Xem ví dụ dưới đây:
# Lấy một mảng 2D làm đầu vào cho DataFrame của bạn my_2darray = np.array([[1, 2, 3], [4, 5, 6]]) print(pd.DataFrame(my_2darray)) # Lấy từ điển làm đầu vào cho DataFrame của bạn my_dict = {1: ['1', '3'], 2: ['1', '2'], 3: ['2', '4']} print(pd.DataFrame(my_dict)) # Lấy DataFrame làm đầu vào cho DataFrame của bạn my_df = pd.DataFrame(data=[4,5,6,7], index=range(0,4), columns=['A']) print(pd.DataFrame(my_df)) # Lấy một Sê-ri làm đầu vào cho DataFrame của bạn my_series = pd.Series({"Belgium":"Brussels", "India":"New Delhi", "United Kingdom":"London", "United States":"Washington"}) print(pd.DataFrame(my_series))
Lưu ý rằng chỉ mục Sê-ri của bạn (và dataframes) chứa các khóa của từ điển gốc, nhưng chúng được sắp xếp: Bỉ sẽ là chỉ mục ở mức 0, trong khi Hoa Kỳ sẽ là chỉ mục ở mức 3.
Các bài viết khác:
Sau khi bạn đã tạo DataFrame của mình, bạn có thể muốn biết thêm một chút về nó. Bạn có thể sử dụng thuộc tính shape hoặc hàm len() kết hợp với thuộc tính .index:
df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6]])) # Sử dụng thuộc tính `shape` print(df.shape) # Hoặc sử dụng hàm `len()` với thuộc tính `index` print(len(df))
Hai tùy chọn này cung cấp cho bạn thông tin hơi khác nhau về dataframes của bạn: thuộc tính hình dạng sẽ cung cấp cho bạn kích thước của dataframes. Điều đó có nghĩa là bạn sẽ biết chiều rộng và chiều cao của DataFrame của mình. Mặt khác, hàm len(), kết hợp với thuộc tính chỉ mục, sẽ chỉ cung cấp cho bạn thông tin về chiều cao của dataframes của bạn.
Tuy nhiên, tất cả điều này hoàn toàn không phải là bất thường, vì bạn đã đưa ra thuộc tính chỉ mục một cách rõ ràng.
Bạn cũng có thể sử dụng df[0].count() để biết thêm về chiều cao của dataframes của mình, nhưng điều này sẽ loại trừ các giá trị NaN (nếu có). Đó là lý do tại sao việc gọi .count() trên DataFrame của bạn không phải lúc nào cũng là lựa chọn tốt hơn.
Nếu bạn muốn biết thêm thông tin về các cột DataFrame của mình, bạn luôn có thể thực thi list(my_dataframe.columns.values).
Cách chọn Chỉ mục hoặc Cột từ dataframes Pandas
Trước khi bạn bắt đầu thêm, xóa và đổi tên các thành phần của DataFrame, trước tiên bạn cần biết cách bạn có thể chọn các thành phần này. Vì vậy, làm thế nào để bạn làm điều này?
Mặc dù bạn có thể vẫn nhớ cách thực hiện từ phần trước: chọn một chỉ mục, cột hoặc giá trị từ DataFrame của bạn không khó lắm, ngược lại. Nó tương tự như những gì bạn thấy trong các ngôn ngữ (hoặc gói!) khác được sử dụng để phân tích dữ liệu. Nếu bạn không bị thuyết phục, hãy xem xét những điều sau:
Trong R, bạn sử dụng ký hiệu [,] để truy cập các giá trị của dataframes.
Bây giờ, giả sử bạn có một DataFrame như thế này:
A B C 0 1 2 3 1 4 5 6 2 7 8 9
Và bạn muốn truy cập giá trị ở chỉ mục 0, trong cột ‘A’.
Có nhiều tùy chọn khác nhau để lấy lại giá trị 1 của bạn:
# sử dụng `iloc[]` print(df.iloc[0][0]) # sử dụng `loc[]` print(df.loc[0]['A']) # sử dụng `at[]` print(df.at[0,'A']) # sử dụng `iat[]` print(df.iat[0,0])
Chắc chắn những điều quan trọng nhất cần nhớ là .loc[] và .iloc[].
Bây giờ là đủ về việc chọn các giá trị từ DataFrame của bạn. Còn việc chọn hàng và cột thì sao? Trong trường hợp đó, bạn sẽ sử dụng:
# sử dụng `iloc[]` để chọn row `0` print(df.iloc[0]) # sử dụng `loc[]`để chọn column `'A'` print(df.loc[:,'A'])
Hiện tại, chỉ cần biết rằng bạn có thể truy cập các giá trị bằng cách gọi chúng theo nhãn hoặc theo vị trí của chúng trong chỉ mục hoặc cột là đủ. Nếu bạn không thấy điều này, hãy xem lại sự khác biệt nhỏ trong các lệnh: một lần, bạn thấy [0][0], lần khác, bạn thấy [0,’A’] để truy xuất giá trị 1 của mình.
Cách thêm index, row hoặc Column vào dataframe Pandas
Bây giờ bạn đã học cách chọn một giá trị từ DataFrame, đã đến lúc bắt tay vào công việc thực sự và thêm chỉ mục, hàng hoặc cột vào đó!
Thêm một Index vào DataFrame
Khi bạn tạo một DataFrame, bạn có tùy chọn thêm đầu vào vào đối số ‘index’ để đảm bảo rằng bạn có chỉ mục mong muốn. Khi bạn không chỉ định điều này, theo mặc định, DataFrame của bạn sẽ có một chỉ mục có giá trị bằng số bắt đầu bằng 0 và tiếp tục cho đến hàng cuối cùng của DataFrame.
Tuy nhiên, ngay cả khi chỉ mục của bạn được chỉ định tự động cho bạn, bạn vẫn có quyền sử dụng lại một trong các cột của mình và biến nó thành chỉ mục của bạn. Bạn có thể dễ dàng thực hiện việc này bằng cách gọi set_index() trên DataFrame của mình.
# In ra DataFrame `df` của bạn để kiểm tra print(df) # Đặt 'C' làm chỉ mục cho Khung dữ liệu của bạn df.set_index('C')
Thêm hàng vào DataFrame
Trước khi bạn có thể tìm ra giải pháp, trước tiên, bạn nên nắm bắt khái niệm về loc và cách nó khác với các thuộc tính lập chỉ mục khác, chẳng hạn như .iloc[] và .ix[]:
.loc[] hoạt động trên nhãn của chỉ mục của bạn. Điều này có nghĩa là nếu bạn cung cấp loc[2], bạn sẽ tìm các giá trị của DataFrame có chỉ mục được gắn nhãn 2.
.iloc[] hoạt động trên các vị trí trong chỉ mục của bạn. Điều này có nghĩa là nếu bạn đưa vào iloc[2], bạn sẽ tìm kiếm các giá trị của Khung dữ liệu của mình ở chỉ mục ‘2`.
.ix[] là trường hợp phức tạp hơn: khi chỉ mục dựa trên số nguyên, bạn chuyển nhãn cho .ix[]. ix[2] thì có nghĩa là bạn đang tìm trong DataFrame của mình các giá trị có chỉ mục được gắn nhãn 2. Điều này cũng giống như .loc[]! Tuy nhiên, nếu chỉ mục của bạn không chỉ dựa trên số nguyên, thì ix sẽ hoạt động với các vị trí, giống như .iloc[].
Tất cả điều này có vẻ rất phức tạp. Hãy minh họa tất cả những điều này bằng một ví dụ nhỏ:
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), index= [2, 'A', 4], columns=[48, 49, 50]) # truyển `2` đến `loc` print(df.loc[2]) # Truyền `2` cho `iloc` print(df.iloc[2])
Lưu ý rằng trong trường hợp này, bạn đã sử dụng một ví dụ về DataFrame không chỉ dựa trên số nguyên để giúp bạn hiểu sự khác biệt dễ dàng hơn. Bạn thấy rõ rằng việc chuyển 2 đến .loc[] hoặc .iloc[]/.ix[] không cho kết quả giống nhau!
Bạn biết rằng .loc[] sẽ đi và xem xét các giá trị ở nhãn 2. Kết quả mà bạn nhận được sẽ là
48 1 49 2 50 3 Name: 2, dtype: int64 48 7 49 8 50 9 Name: 4, dtype: int64
Vì chỉ mục không chỉ chứa các số nguyên nên .ix[] sẽ có hành vi giống như iloc và xem xét các vị trí trong chỉ mục. Bạn sẽ nhận được kết quả tương tự như .iloc[].
Giờ đây, sự khác biệt giữa .iloc[], .loc[] và .ix[] đã rõ ràng, bạn đã sẵn sàng để thêm hàng vào DataFrame của mình!
Mẹo: do kết quả của những gì bạn vừa đọc, giờ đây bạn cũng hiểu rằng khuyến nghị chung là bạn nên sử dụng .loc để chèn các hàng vào Khung dữ liệu của mình. Đó là bởi vì nếu bạn sử dụng df.ix[], bạn có thể cố gắng tham chiếu một chỉ mục có giá trị bằng số với giá trị chỉ mục và vô tình ghi đè lên một hàng hiện có trong DataFrame của bạn. Bạn nên tránh điều này!
Kiểm tra sự khác biệt một lần nữa trong DataFrame bên dưới:
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), index= [2.5, 12.6, 4.8], columns=[48, 49, 50]) # Điều này sẽ tạo một chỉ mục có nhãn `2` và thêm các giá trị mới df.loc[2] = [11, 12, 13] print(df)
Thêm một cột vào DataFrame
Trong một số trường hợp, bạn muốn biến chỉ mục thành một phần của DataFrame. Bạn có thể dễ dàng thực hiện việc này bằng cách lấy một cột từ DataFrame của mình hoặc bằng cách tham chiếu đến một cột mà bạn chưa tạo và gán cột đó cho thuộc tính .index, giống như sau:
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), columns=['A', 'B', 'C']) # sử dụng `.index` df['D'] = df.index # xuất ra giá trị `df` print(df)
Nói cách khác, bạn nói với DataFrame của mình rằng nó sẽ lấy cột A làm chỉ mục.
Tuy nhiên, nếu bạn muốn nối các cột vào DataFrame của mình, bạn cũng có thể thực hiện theo cách tương tự như khi bạn thêm chỉ mục vào DataFrame của mình: bạn sử dụng .loc[] hoặc .iloc[]. Trong trường hợp này, bạn thêm Sê-ri vào Khung dữ liệu hiện có với sự trợ giúp của .loc[]:
print(df) # Nối một cột vào `df` df.loc[:, 4] = pd.Series(['5', '6', '7'], index=df.index) # In lại `df` để xem các thay đổi print(df)
Hãy nhớ rằng một đối tượng Sê-ri giống như một cột của Khung dữ liệu. Điều đó giải thích tại sao bạn có thể dễ dàng thêm Sê-ri vào Khung dữ liệu hiện có. Cũng xin lưu ý rằng quan sát được đưa ra trước đó về .loc[] vẫn hợp lệ, ngay cả khi bạn đang thêm các cột vào Khung dữ liệu của mình!
Đặt lại chỉ mục của DataFrame
Khi chỉ mục của bạn trông không hoàn toàn theo cách bạn muốn, bạn có thể chọn đặt lại chỉ mục. Bạn có thể dễ dàng làm điều này với .reset_index(). Tuy nhiên, bạn vẫn nên coi chừng, vì bạn có thể đưa ra một số đối số có thể tạo ra hoặc phá vỡ thành công của quá trình thiết lập lại:
# Kiểm tra chỉ mục kỳ lạ của khung dữ liệu print(df) # Sử dụng `reset_index()` để đặt lại các giá trị. df_reset = df.reset_index(level=0, drop=True) # In `df_reset` print(df_reset)
Bạn có thể thử thay đối số drop bằng inplace trong ví dụ trên và xem điều gì sẽ xảy ra!
Lưu ý cách bạn sử dụng đối số drop để chỉ ra rằng bạn muốn loại bỏ chỉ mục ở đó. Nếu bạn đã sử dụng tại chỗ, thì chỉ mục ban đầu có số float sẽ được thêm dưới dạng một cột bổ sung vào Khung dữ liệu của bạn.
Cách xóa các chỉ mục, hàng hoặc cột khỏi khung dữ liệu Pandas
Bây giờ bạn đã thấy cách chọn và thêm chỉ mục, hàng và cột vào DataFrame của mình, đã đến lúc xem xét một trường hợp sử dụng khác: xóa ba chỉ mục này khỏi cấu trúc dữ liệu của bạn.
Xóa một Index khỏi DataFrame
Nếu bạn muốn xóa index khỏi DataFrame của mình, bạn nên xem xét lại vì DataFrames và Sê-ri luôn có chỉ mục.
Tuy nhiên, những gì bạn có thể làm, chẳng hạn như:
Đặt lại chỉ mục của DataFrame của bạn (quay lại phần trước để xem nó được thực hiện như thế nào) hoặc
xóa tên chỉ mục, nếu có, bằng cách thực hiện del df.index.name,
xóa các giá trị chỉ mục trùng lặp bằng cách đặt lại chỉ mục, loại bỏ các bản sao của cột chỉ mục đã được thêm vào DataFrame của bạn và khôi phục lại cột không trùng lặp đó làm chỉ mục
và cuối cùng, xóa một chỉ mục và cùng với nó là một hàng.
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [40, 50, 60], [23, 35, 37]]), index= [2.5, 12.6, 4.8, 4.8, 2.5], columns=[48, 49, 50]) df.reset_index().drop_duplicates(subset='index', keep='last').set_index('index')
Bây giờ bạn đã biết cách xóa chỉ mục khỏi DataFrame của mình, bạn có thể tiếp tục xóa cột và hàng!
Xóa một cột khỏi DataFrame
Để loại bỏ (một lựa chọn) cột khỏi DataFrame của bạn, bạn có thể sử dụng phương thức drop() :
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), columns=['A', 'B', 'C']) # Kiểm tra Khung dữ liệu `df` print(df) # Bỏ cột có nhãn 'A' df.drop('A', axis=1, inplace=True) # Thả cột tại vị trí 1 df.drop(df.columns[[1]], axis=1)
Có một số đối số bổ sung được truyền cho phương thức drop()!
Đối số trục là 0 khi nó biểu thị hàng và 1 khi nó được sử dụng để thả cột.
Bạn có thể đặt inplace thành True để xóa cột mà không phải gán lại DataFrame.
Xóa một hàng khỏi DataFrame
Bạn có thể xóa các hàng trùng lặp khỏi DataFrame của mình bằng cách thực thi df.drop_duplicates(). Bạn cũng có thể xóa các hàng khỏi DataFrame của mình, chỉ tính đến các giá trị trùng lặp tồn tại trong một cột.
Kiểm tra ví dụ này:
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [40, 50, 60], [23, 35, 37]]), index= [2.5, 12.6, 4.8, 4.8, 2.5], columns=[48, 49, 50]) # Kiểm tra DataFrame `df` của bạn print(df) # Thả các bản sao vào `df` df.drop_duplicates([48], keep='last')
Nếu không có tiêu chí duy nhất cho việc xóa mà bạn muốn thực hiện, bạn có thể sử dụng phương thức drop(), trong đó bạn sử dụng thuộc tính chỉ mục để chỉ định chỉ mục của những hàng bạn muốn xóa khỏi DataFrame của mình:
# Kiểm tra Khung dữ liệu `df` print(df) # Bỏ chỉ số ở vị trí 1 df.drop(df.index[1])
Sau lệnh này, bạn có thể muốn đặt lại chỉ mục.
Mẹo: hãy thử đặt lại chỉ mục của DataFrame kết quả cho chính bạn! Đừng quên sử dụng đối số drop nếu bạn thấy cần thiết.
Cách đổi tên index hoặc cột của dataframe Pandas
Để cung cấp cho các cột hoặc giá trị index của dataframe của bạn một giá trị khác, tốt nhất bạn nên sử dụng phương thức .rename().
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), columns=['A', 'B', 'C']) # Kiểm tra DataFrame `df` print(df) # Xác định tên mới cho các cột của bạn newcols = { 'A': 'new_column_1', 'B': 'new_column_2', 'C': 'new_column_3' } # Sử dụng `rename()` để đổi tên các cột của bạn df.rename(columns=newcols, inplace=True) # Đổi tên chỉ mục df.rename(index={1: 'a'})
Mẹo: hãy thử thay đổi đối số tại chỗ trong tác vụ đầu tiên (đổi tên cột) thành Sai và xem kết quả hiện tại của tập lệnh hiển thị. Bạn thấy rằng bây giờ DataFrame chưa được chỉ định lại khi đổi tên các cột. Do đó, tác vụ thứ hai lấy DataFrame ban đầu làm đầu vào chứ không phải tác vụ mà bạn vừa lấy lại từ thao tác rename() đầu tiên.
Cách định dạng dữ liệu trong dataframe Pandas
Hầu hết thời gian, bạn cũng sẽ muốn có thể thực hiện một số thao tác trên các giá trị thực có trong DataFrame của mình. Trong các phần sau, bạn sẽ đề cập đến một số cách để bạn có thể định dạng các giá trị của dataframe gấu trúc của mình
Thay thế tất cả các lần xuất hiện của Chuỗi trong DataFrame
Để thay thế một số chuỗi nhất định trong DataFrame của bạn, bạn có thể dễ dàng sử dụng replace(): chuyển các giá trị mà bạn muốn thay đổi, theo sau là các giá trị bạn muốn thay thế chúng.
Chỉ như thế này:
df = pd.DataFrame({"Student1":['OK','Awful','Acceptable'], "Student2":['Perfect','Awful','OK'], "Student3":['Acceptable','Perfect','Poor']}) # Nghiên cứu DataFrame `df` trước print(df) # Thay thế các chuỗi bằng các giá trị số (0-4) df.replace(['Awful', 'Poor', 'OK', 'Acceptable', 'Perfect'], [0, 1, 2, 3, 4])
Lưu ý rằng cũng có một đối số biểu thức chính quy có thể giúp bạn rất nhiều khi bạn phải đối mặt với các tổ hợp chuỗi lạ:
df = pd.DataFrame([["1\n", 2, "3\n"], [4, 5, "6\n"] ,[7, "8\n", 9]]) # Kiểm tra DataFrame `df` của bạn print(df) # Thay thế chuỗi bằng chuỗi khác bằng `regex` df.replace({'\n': ''}, regex=True)
Nói tóm lại, replace() chủ yếu là những gì bạn cần xử lý khi muốn thay thế các giá trị hoặc chuỗi trong DataFrame của mình bằng người khác!
Xóa các bộ phận khỏi chuỗi trong các ô của DataFrame
Loại bỏ các phần không mong muốn của chuỗi là công việc phức tạp. May mắn thay, có một giải pháp dễ dàng cho vấn đề này!
df = pd.DataFrame([["+-1aAbBcC", "2", "+-3aAbBcC"], ["4", "5", "+-6aAbBcC"] ,["7", "+-8aAbBcC", "9"]]) # Kiểm tra DataFrame của bạn print(df) # Xóa các phần không mong muốn khỏi chuỗi trong cột đầu tiên df[0] = df[0].map(lambda x: x.lstrip('+-').rstrip('aAbBcC')) # Kiểm tra lại kết quả df
Bạn sử dụng map() trên kết quả cột để áp dụng hàm lambda trên từng phần tử hoặc từng phần tử của cột. Bản thân hàm này lấy giá trị chuỗi và loại bỏ dấu + hoặc – nằm ở bên trái, đồng thời loại bỏ bất kỳ aAbBcC nào trong số sáu aAbBcC ở bên phải.
Tách văn bản trong một cột thành nhiều hàng trong DataFrame
Đây là một nhiệm vụ định dạng khó khăn hơn. Tuy nhiên, đoạn mã tiếp theo sẽ hướng dẫn bạn qua các bước:
df = pd.DataFrame({"Age": [34, 22, 19], "PlusOne":[0,0,1], "Ticket":["23:44:55", "66:77:88", "43:68:05 56:34:12"]}) # Kiểm tra Khung dữ liệu của bạn `df` print(df) # Tách hai giá trị ở hàng thứ ba # Biến nó thành một sê-ri # Xếp chồng các giá trị ticket_series = df['Ticket'].str.split(' ').apply(pd.Series, 1).stack() # Loại bỏ ngăn xếp: # Giảm cấp độ để phù hợp với DataFrame ticket_series.index = ticket_series.index.droplevel(-1) print(ticket_series)
Nói tóm lại, những gì bạn làm là:
Đầu tiên, bạn kiểm tra DataFrame trong tầm tay. Bạn thấy rằng các giá trị ở hàng cuối cùng và cột cuối cùng hơi dài. Có vẻ như có hai vé vì một vị khách đã mua thêm một vé cho buổi hòa nhạc.
Bạn lấy cột Vé từ DataFrame df và các chuỗi trên một khoảng trắng. Điều này sẽ đảm bảo rằng cuối cùng hai vé sẽ xếp thành hai hàng riêng biệt. Tiếp theo, bạn lấy bốn giá trị này (bốn số vé) và đặt chúng vào một đối tượng Sê-ri:
0 1 0 23:44:55 NaN 1 66:77:88 NaN 2 43:68:05 56:34:12
Điều đó vẫn không có vẻ đúng. Bạn có các giá trị NaN trong đó! Bạn phải xếp Sê-ri để đảm bảo rằng bạn không có bất kỳ giá trị NaN nào trong Sê-ri kết quả.
Tiếp theo, bạn thấy rằng Sê-ri của bạn được xếp chồng lên nhau.
0 0 23:44:55 1 0 66:77:88 2 0 43:68:05 1 56:34:12
Đó cũng không phải là lý tưởng. Đó là lý do tại sao bạn giảm cấp độ để phù hợp với DataFrame:
0 23:44:55 1 66:77:88 2 43:68:05 2 56:34:12 dtype: object
Đó là những gì bạn đang tìm kiếm.
Chuyển đổi Sê-ri của bạn thành DataFrame để đảm bảo bạn có thể nối nó trở lại ini của mình
cuối cùng DataFrame. Tuy nhiên, để tránh có bất kỳ sự trùng lặp nào trong DataFrame của bạn, bạn có thể xóa cột Vé ban đầu.
Áp dụng một Hàm cho các Cột hoặc Hàng của dataframe Pandas
Bạn có thể muốn điều chỉnh dữ liệu trong DataFrame của mình bằng cách áp dụng một chức năng cho nó. Hãy bắt đầu trả lời câu hỏi này bằng cách tạo hàm lambda của riêng bạn:
doubler = lambda x: x*2
Mẹo: nếu bạn muốn biết thêm về các hàm trong Python, hãy xem hướng dẫn về hàm Python này.
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), columns=['A', 'B', 'C']) # Nghiên cứu Khung dữ liệu `df` print(df) # Áp dụng hàm `nhân đôi` cho cột `A` DataFrame df['A'].apply(doubler) A B C 0 1 2 3 1 4 5 6 2 7 8 9 0 2 1 8 2 14 Name: A, dtype: int64
Lưu ý rằng bạn cũng có thể chọn hàng DataFrame của mình và áp dụng hàm lambda nhân đôi cho nó. Hãy nhớ rằng bạn có thể dễ dàng chọn một hàng từ DataFrame của mình bằng cách sử dụng .loc[] hoặc .iloc[].
Sau đó, bạn sẽ thực hiện một cái gì đó như thế này, tùy thuộc vào việc bạn muốn chọn chỉ mục của mình dựa trên vị trí của nó hay dựa trên nhãn của nó:
df.loc[0].apply(doubler)
Lưu ý rằng hàm apply() chỉ áp dụng hàm nhân đôi dọc theo trục của dataframe của bạn. Điều đó có nghĩa là bạn nhắm mục tiêu chỉ mục hoặc cột. Hay nói cách khác, một hàng hoặc một cột.
Tuy nhiên, nếu bạn muốn áp dụng nó cho từng phần tử hoặc từng phần tử, bạn có thể sử dụng hàm map(). Bạn chỉ có thể thay thế hàm apply() trong đoạn mã trên bằng map(). Đừng quên vẫn chuyển hàm nhân đôi cho nó để đảm bảo bạn nhân các giá trị với 2.
Giả sử bạn muốn áp dụng chức năng nhân đôi này không chỉ cho cột A của dataframe mà còn cho toàn bộ cột đó. Trong trường hợp này, bạn có thể sử dụng applymap() để áp dụng chức năng nhân đôi cho mọi phần tử trong toàn bộ dataframe:
doubled_df = df.applymap(doubler) print(doubled_df)
Lưu ý rằng trong những trường hợp này, chúng tôi đã làm việc với các hàm lambda hoặc hàm ẩn danh được tạo trong thời gian chạy. Tuy nhiên, bạn cũng có thể viết chức năng của riêng mình. Ví dụ:
def doubler(x): if x % 2 == 0: return x else: return x * 2 # Sử dụng `applymap()` để áp dụng `doubler()` cho DataFrame của bạn doubled_df = df.applymap(doubler) # Kiểm tra khung dữ liệu print(doubled_df)
Nếu bạn muốn biết thêm thông tin về luồng điều khiển trong Python, bạn luôn có thể xem các tài nguyên khác của chúng tôi.
Cách tạo một DataFrame trống
Hàm mà bạn sẽ sử dụng là hàm Pandas Dataframe(): hàm này yêu cầu bạn chuyển dữ liệu mà bạn muốn đưa vào, các chỉ mục và cột.
Hãy nhớ rằng dữ liệu chứa trong khung dữ liệu không nhất thiết phải đồng nhất. Nó có thể thuộc các loại dữ liệu khác nhau!
Có một số cách mà bạn có thể sử dụng chức năng này để tạo một DataFrame trống. Đầu tiên, bạn có thể sử dụng numpy.nan để khởi tạo khung dữ liệu của mình bằng NaN. Lưu ý rằng numpy.nan có kiểu float.
df = pd.DataFrame(np.nan, index=[0,1,2,3], columns=['A']) print(df)
Ngay bây giờ, kiểu dữ liệu của khung dữ liệu được suy ra theo mặc định: vì numpy.nan có kiểu float, nên khung dữ liệu cũng sẽ chứa các giá trị kiểu float. Tuy nhiên, bạn cũng có thể buộc DataFrame thuộc một loại cụ thể bằng cách thêm thuộc tính dtype và điền vào loại mong muốn. Cũng giống như trong ví dụ này:
df = pd.DataFrame(index=range(0,4),columns=['A'], dtype='float') print(df)
Lưu ý rằng nếu bạn không chỉ định nhãn hoặc chỉ mục trục, chúng sẽ được tạo từ dữ liệu đầu vào dựa trên các quy tắc thông thường.
Pandas có nhận ra ngày khi nhập dữ liệu không?
Pandas có thể nhận ra nó, nhưng bạn cần giúp nó một chút: thêm đối số parse_dates khi bạn đọc dữ liệu từ, giả sử, tệp giá trị được phân tách bằng dấu phẩy (CSV):
import pandas as pd pd.read_csv('yourFile', parse_dates=True) # tùy chọn khác pd.read_csv('yourFile', parse_dates=['columnName'])
Tuy nhiên, luôn có các định dạng ngày giờ kỳ lạ.
Đừng lo lắng! Trong những trường hợp như vậy, bạn có thể xây dựng trình phân tích cú pháp của riêng mình để giải quyết vấn đề này. Ví dụ, bạn có thể tạo một hàm lambda lấy DateTime của bạn và điều khiển nó bằng một chuỗi định dạng.
import pandas as pd dateparser = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S') # Cái nào làm cho lệnh đọc của bạn: pd.read_csv(infile, parse_dates=['columnName'], date_parser=dateparse) # Hoặc kết hợp hai cột thành một cột DateTime duy nhất pd.read_csv(infile, parse_dates={'datetime': ['date', 'time']}, date_parser=dateparse)
Khi nào, tại sao và làm thế nào bạn nên reshape lại dataframe Pandas của mình
reshape lại DataFrame của bạn đang chuyển đổi nó để cấu trúc kết quả làm cho nó phù hợp hơn với phân tích dữ liệu của bạn. Nói cách khác, việc reshape lại không liên quan nhiều đến việc định dạng các giá trị có trong DataFrame, mà quan tâm nhiều hơn đến việc chuyển đổi hình dạng của nó.
Điều này trả lời khi nào và tại sao. Nhưng bạn sẽ reshape lại DataFrame của mình như thế nào?
Có ba cách reshape lại thường đặt ra câu hỏi với người dùng: xoay vòng, xếp chồng và hủy xếp chồng và melt.
Pivot DataFrame
Bạn có thể sử dụng hàm pivot() để tạo một bảng dẫn xuất mới từ bảng gốc của mình. Khi bạn sử dụng hàm, bạn có thể truyền ba đối số:
- Value: đối số này cho phép bạn chỉ định giá trị nào của dataframe ban đầu mà bạn muốn xem trong bảng tổng hợp của mình.
- Column: bất cứ điều gì bạn chuyển đến đối số này sẽ trở thành một cột trong bảng kết quả của bạn.
- Index: bất cứ điều gì bạn chuyển đến đối số này sẽ trở thành một chỉ mục trong bảng kết quả của bạn.
# khai báo pandas import pandas as pd # tạo DataFrame products = pd.DataFrame({'category': ['Cleaning', 'Cleaning', 'Entertainment', 'Entertainment', 'Tech', 'Tech'], 'store': ['Walmart', 'Dia', 'Walmart', 'Fnac', 'Dia','Walmart'], 'price':[11.42, 23.50, 19.99, 15.95, 55.75, 111.55], 'testscore': [4, 3, 5, 7, 5, 8]}) # sử dụng `pivot()` để tiến hành pivot DataFrame pivot_products = products.pivot(index='category', columns='store', values='price') # Kiểm tra kết quả print(pivot_products)
Khi bạn không điền cụ thể những giá trị mà bạn muốn có trong bảng kết quả của mình, bạn sẽ xoay vòng theo nhiều cột:
# khai báo thư viện Pandas library import pandas as pd # khởi tạo một DataFrame products = pd.DataFrame({'category': ['Cleaning', 'Cleaning', 'Entertainment', 'Entertainment', 'Tech', 'Tech'], 'store': ['Walmart', 'Dia', 'Walmart', 'Fnac', 'Dia','Walmart'], 'price':[11.42, 23.50, 19.99, 15.95, 55.75, 111.55], 'testscore': [4, 3, 5, 7, 5, 8]}) # sử dụng `pivot()` để pivot DataFrame pivot_products = products.pivot(index='category', columns='store') #kiếm tra kết quả print(pivot_products)
Lưu ý rằng dữ liệu của bạn không thể có các hàng có giá trị trùng lặp cho các cột mà bạn chỉ định. Nếu đây không phải là trường hợp, bạn sẽ nhận được thông báo lỗi. Nếu bạn không thể đảm bảo tính duy nhất của dữ liệu, bạn sẽ muốn sử dụng phương thức pivot_table để thay thế:
# khai báo thư viện Pandas import pandas as pd # khai báo DataFrame products = pd.DataFrame({'category': ['Cleaning', 'Cleaning', 'Entertainment', 'Entertainment', 'Tech', 'Tech'], 'store': ['Walmart', 'Dia', 'Walmart', 'Fnac', 'Dia','Walmart'], 'price':[11.42, 23.50, 19.99, 15.95, 19.99, 111.55], 'testscore': [4, 3, 5, 7, 5, 8]}) # Xoay khung dữ liệu `sản phẩm` của bạn với `pivot_table()` pivot_products = products.pivot_table(index='category', columns='store', values='price', aggfunc='mean') # kiểm tra kết quả print(pivot_products)
Lưu ý đối số bổ sung aggfunc được chuyển đến phương thức pivot_table. Đối số này cho biết rằng bạn sử dụng hàm tổng hợp dùng để kết hợp nhiều giá trị. Trong ví dụ này, bạn có thể thấy rõ rằng hàm trung bình được sử dụng.
Sử dụng stack() và unstack() để reshape lại dataframe Pandas
Về bản chất, bạn có thể vẫn nhớ rằng khi bạn stack một DataFrame, bạn sẽ làm cho nó cao hơn. Bạn di chuyển chỉ mục cột trong cùng để trở thành chỉ mục hàng trong cùng. Bạn trả về một DataFrame với một chỉ mục có nhãn hàng ở cấp độ bên trong mới nhất.
Nghịch đảo của xếp chồng được gọi là unstacking. Giống như stack(), bạn sử dụng unstack() để di chuyển chỉ mục hàng trong cùng thành chỉ mục cột trong cùng.
reshape lại dataframe của bạn Với sự melt ()
Melting được coi là hữu ích trong trường hợp bạn có dữ liệu có một hoặc nhiều cột là biến định danh, trong khi tất cả các cột khác được coi là biến đo lường.
Tất cả các biến được đo này đều “không được xoay” vào trục hàng. Đó là, trong khi các biến được đo được trải rộng trên chiều rộng của DataFrame, thì sự melt sẽ đảm bảo rằng chúng sẽ được đặt theo chiều cao của nó. Hay nói cách khác, DataFrame của bạn bây giờ sẽ dài hơn thay vì rộng hơn.
Kết quả là bạn có hai cột không định danh, cụ thể là ‘biến’ và ‘giá trị’.
Hãy minh họa điều này bằng một ví dụ:
# Khung dữ liệu `người` people = pd.DataFrame({'FirstName' : ['John', 'Jane'], 'LastName' : ['Doe', 'Austen'], 'BloodType' : ['A-', 'B+'], 'Weight' : [90, 64]}) # Sử dụng `melt()` trên DataFrame `people` print(pd.melt(people, id_vars=['FirstName', 'LastName'], var_name='measurements'))
Cách lặp lại trên Khung dữ liệu Pandas
Bạn có thể lặp qua các hàng trong DataFrame của mình với sự trợ giúp của vòng lặp for kết hợp với lệnh gọi iterrows() trên DataFrame của bạn:
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), columns=['A', 'B', 'C']) for index, row in df.iterrows() : print(row['A'], row['B'])
iterrows() cho phép bạn lặp lại hiệu quả các hàng DataFrame của mình dưới dạng các cặp (chỉ mục, Sê-ri). Nói cách khác, kết quả là nó cung cấp cho bạn các bộ dữ liệu (chỉ mục, hàng).
Cách ghi Khung dữ liệu Pandas vào file
Khi bạn đã thực hiện thao tác trộn và thao tác dữ liệu của mình với Pandas, bạn có thể muốn xuất DataFrame sang định dạng khác. Phần này sẽ đề cập đến hai cách xuất DataFrame gấu trúc của bạn sang CSV hoặc tệp Excel.
Xuất DataFrame to CSV
import pandas as pd df.to_csv('myDataFrame.csv')
Để viết DataFrame dưới dạng tệp CSV, bạn có thể sử dụng to_csv():
Đoạn mã đó có vẻ khá đơn giản, nhưng đây chỉ là nơi khó khăn bắt đầu đối với hầu hết mọi người vì bạn sẽ có các yêu cầu cụ thể đối với đầu ra dữ liệu của mình. Có thể bạn không muốn dùng dấu phẩy làm dấu phân cách hoặc bạn muốn chỉ định một mã hóa cụ thể.
Đừng lo! Bạn có thể chuyển một số đối số bổ sung cho to_csv() để đảm bảo rằng dữ liệu của bạn được xuất ra theo cách bạn muốn!
Để phân định bằng một tab, hãy sử dụng đối số sep:
import pandas as pd df.to_csv('myDataFrame.csv', sep='\t')
Để sử dụng mã hóa ký tự cụ thể, bạn có thể sử dụng đối số mã hóa:
import pandas as pd df.to_csv('myDataFrame.csv', sep='\t', encoding='utf-8')
Hơn nữa, bạn có thể chỉ định cách bạn muốn NaN hoặc các giá trị bị thiếu được biểu thị, bạn có muốn xuất tiêu đề hay không, bạn có muốn viết ra tên hàng hay không, bạn có muốn nén hay không, bạn có thể đọc trên tùy chọn.
Viết một DataFrame vào Excel
Tương tự như những gì bạn đã làm để xuất DataFrame sang CSV, bạn có thể sử dụng to_excel() để ghi bảng của mình vào Excel. Tuy nhiên, nó phức tạp hơn một chút:
import pandas as pd writer = pd.ExcelWriter('myDataFrame.xlsx') df.to_excel(writer, 'DataFrame') writer.save()
Tuy nhiên, xin lưu ý rằng, giống như với to_csv(), bạn có nhiều đối số bổ sung như startcol, startrow, v.v., để đảm bảo bạn xuất dữ liệu chính xác. Bạn có thể tìm hiểu thêm về cách nhập dữ liệu từ và xuất dữ liệu sang tệp CSV bằng pandas trong hướng dẫn của chúng tôi.
Tuy nhiên, nếu bạn muốn biết thêm thông tin về các công cụ IO trong Pandas, bạn hãy xem tài liệu về DataFrames to excel của pandas.