Kiểu dữ liệu chuỗi theo truyền thống là một chuỗi các ký tự, dưới dạng hằng số hoặc dưới dạng một số loại biến. Cái sau có thể cho phép các phần tử của nó bị thay đổi và độ dài thay đổi hoặc nó có thể được cố định [sau khi tạo]. Một chuỗi thường được coi là một kiểu dữ liệu và thường được triển khai dưới dạng cấu trúc dữ liệu mảng gồm các byte [hoặc từ] lưu trữ một chuỗi các phần tử, thường là các ký tự, sử dụng một số mã hóa ký tự
Thảo luận
Tùy thuộc vào ngôn ngữ lập trình và loại dữ liệu chính xác được sử dụng, một biến được khai báo là một chuỗi có thể khiến lưu trữ trong bộ nhớ được phân bổ tĩnh cho độ dài tối đa được xác định trước hoặc sử dụng phân bổ động để cho phép nó chứa một số phần tử thay đổi. Khi một chuỗi xuất hiện theo nghĩa đen trong mã nguồn, nó được gọi là chuỗi ký tự hoặc chuỗi ẩn danh
Loại dữ liệu ký tự đại diện cho các ký tự riêng lẻ hoặc đơn lẻ. Các ký tự bao gồm nhiều loại ký hiệu như bảng chữ cái [cả chữ hoa và chữ thường], các chữ số [0 đến 9], dấu chấm câu, v.v. Tất cả các máy tính lưu trữ dữ liệu ký tự trong trường một byte dưới dạng giá trị số nguyên. Bởi vì một byte bao gồm 8 bit, trường một byte này có 28 hoặc 256 khả năng sử dụng các giá trị dương từ 0 đến 255
C ++, C # và Java phân biệt giữa các ký tự đơn và chuỗi bằng cách sử dụng dấu ngoặc đơn và dấu ngoặc kép tương ứng. JavaScript, Python và Swift không phân biệt giữa ký tự và chuỗi và sử dụng dấu nháy đơn hoặc dấu nháy kép để xác định chuỗi ký tự
LanguageReserved WordExampleC++char
'A'
C++string
"Hello world!"
C#char
'A'
C#String
"Hello world!"
Javachar
'A'
JavaString
"Hello world!"
JavaScriptString
'A'
3, "Hello world!"
Python'A'
5'A'
3, "Hello world!"
Swift'A'
8'A'
9SwiftString
"Hello world!"
Hầu hết các thiết bị máy tính đều sử dụng Bộ ký tự ASCII [viết tắt của Mã tiêu chuẩn Mỹ để trao đổi thông tin và được phát âm là “khóa hỏi”] Bộ ký tự có các giá trị được thiết lập từ 0 đến 127. Đối với các giá trị từ 128 đến 255, chúng thường sử dụng Bộ ký tự ASCII mở rộng. Khi chúng ta nhấn chữ A trên bàn phím, bàn phím sẽ gửi một byte có mẫu bit bằng một số nguyên 65. Khi byte được gửi từ bộ nhớ đến màn hình, màn hình sẽ chuyển đổi giá trị nguyên 65 thành ký hiệu của chữ A viết hoa để hiển thị trên màn hình
Hiện tại, chúng tôi sẽ chỉ giải quyết việc sử dụng các chuỗi và ký tự làm hằng số. Hầu hết các trình biên dịch hiện đại là một phần của Môi trường phát triển tích hợp [IDE] sẽ tô màu mã nguồn để giúp lập trình viên nhìn thấy các tính năng khác nhau dễ dàng hơn. Các lập trình viên mới bắt đầu sẽ sử dụng các hằng chuỗi để gửi tin nhắn đến đầu ra tiêu chuẩn
Định dạng của các cột và hàng riêng lẻ sẽ tác động đến phân tích được thực hiện trên tập dữ liệu được đọc bằng Python. Ví dụ: bạn không thể thực hiện các phép tính toán học trên một chuỗi [dữ liệu được định dạng văn bản]. Điều này có vẻ hiển nhiên, tuy nhiên đôi khi các giá trị số được đọc vào Python dưới dạng chuỗi. Trong tình huống này, khi bạn cố gắng thực hiện các phép tính trên dữ liệu số có định dạng chuỗi, bạn sẽ gặp lỗi
Trong bài học này, chúng tôi sẽ xem xét các cách để khám phá và hiểu rõ hơn về cấu trúc và định dạng dữ liệu của chúng tôi
Các loại dữ liệu
Cách thông tin được lưu trữ trong DataFrame hoặc đối tượng Python ảnh hưởng đến những gì chúng ta có thể làm với nó và cả kết quả tính toán. Có hai loại dữ liệu chính mà chúng ta sẽ khám phá trong bài học này. kiểu dữ liệu số và văn bản
Kiểu dữ liệu số
Các kiểu dữ liệu số bao gồm số nguyên và số float. Số dấu phẩy động [được gọi là số float] có dấu thập phân ngay cả khi giá trị dấu thập phân đó bằng 0. Ví dụ. 1. 13, 2. 0, 1234. 345. Nếu chúng ta có một cột chứa cả số nguyên và số dấu phẩy động, Pandas sẽ gán toàn bộ cột cho kiểu dữ liệu float để các dấu thập phân không bị mất
Một số nguyên sẽ không bao giờ có dấu thập phân. Vì vậy, nếu chúng ta muốn lưu trữ 1. 13 dưới dạng số nguyên, nó sẽ được lưu dưới dạng 1. Tương tự, 1234. 345 sẽ được lưu trữ dưới dạng 1234. Bạn sẽ thường thấy kiểu dữ liệu
surveys_df['sex'].dtype
4 trong Python viết tắt của số nguyên 64 bit. 64 đề cập đến bộ nhớ được phân bổ để lưu trữ dữ liệu trong mỗi ô, liên quan hiệu quả đến số lượng chữ số mà nó có thể lưu trữ trong mỗi “ô”. Phân bổ không gian trước thời hạn cho phép máy tính tối ưu hóa hiệu quả lưu trữ và xử lýKiểu dữ liệu văn bản
Kiểu dữ liệu văn bản được gọi là Chuỗi trong Python hoặc Đối tượng trong Pandas. Chuỗi có thể chứa số và/hoặc ký tự. Ví dụ: một chuỗi có thể là một từ, một câu hoặc nhiều câu. Một đối tượng Pandas cũng có thể là một tên cốt truyện như 'plot1'. Một chuỗi cũng có thể chứa hoặc bao gồm các số. Chẳng hạn, '1234' có thể được lưu trữ dưới dạng một chuỗi, cũng như '10'. 23’. Tuy nhiên, các chuỗi chứa số không thể được sử dụng cho các phép toán
Pandas và Python cơ sở sử dụng các tên hơi khác nhau cho các loại dữ liệu. Thêm về điều này là trong bảng dưới đây
Pandas TypeNative Python TypeDescriptionobjectstringDtype chung nhất. Sẽ được gán cho cột của bạn nếu cột có nhiều loại [số và chuỗi]. int64intKý tự số. 64 đề cập đến bộ nhớ được phân bổ để giữ ký tự này. float64 float Các ký tự số có số thập phân. Nếu một cột chứa số và NaN [xem bên dưới], gấu trúc sẽ mặc định là float64, trong trường hợp giá trị bị thiếu của bạn có số thập phân. datetime64, timedelta[ns]N/A [nhưng hãy xem mô-đun datetime trong thư viện chuẩn của Python] Các giá trị dùng để chứa dữ liệu thời gian. Nhìn vào những điều này cho các thí nghiệm chuỗi thời gianKiểm tra định dạng dữ liệu của chúng tôi
Giờ đây, chúng ta đã được trang bị kiến thức cơ bản về các loại dữ liệu số và văn bản, hãy cùng khám phá định dạng dữ liệu khảo sát của chúng ta. Chúng ta sẽ làm việc với cùng một tập dữ liệu
surveys_df['sex'].dtype
5 mà chúng ta đã sử dụng trong các bài học trước# Make sure pandas is loaded
import pandas as pd
# Note that pd.read_csv is used because we imported pandas as pd
surveys_df = pd.read_csv["data/surveys.csv"]
Hãy nhớ rằng chúng ta có thể kiểm tra loại đối tượng như thế này
type[surveys_df]
pandas.core.frame.DataFrame
Tiếp theo, hãy xem cấu trúc dữ liệu khảo sát của chúng tôi. Trong pandas, chúng ta có thể kiểm tra loại của một cột trong DataFrame bằng cú pháp
surveys_df['sex'].dtype
6surveys_df['sex'].dtype
dtype['O']
Loại 'O' chỉ là viết tắt của "đối tượng" mà trong thế giới của Pandas là một chuỗi [văn bản]
________số 8_______
dtype['int64']
Loại
surveys_df['sex'].dtype
7 cho chúng ta biết rằng Python đang lưu trữ từng giá trị trong cột này dưới dạng số nguyên 64 bit. Chúng ta có thể sử dụng lệnh surveys_df['sex'].dtype
8 để xem kiểu dữ liệu cho từng cột trong DataFrame [tất cả cùng một lúc]surveys_df.dtypes
trả về
record_id int64
month int64
day int64
year int64
plot_id int64
species_id object
sex object
hindfoot_length float64
weight float64
dtype: object
Lưu ý rằng hầu hết các cột trong dữ liệu Khảo sát của chúng tôi thuộc loại
surveys_df['sex'].dtype
7. Điều này có nghĩa là chúng là số nguyên 64 bit. Nhưng cột trọng lượng là một giá trị dấu phẩy động có nghĩa là nó chứa số thập phân. Các cột dtype['O']
0 và dtype['O']
1 là các đối tượng có nghĩa là chúng chứa các chuỗiLàm việc với số nguyên và số float
Vì vậy, chúng tôi đã học được rằng máy tính lưu trữ số theo một trong hai cách. dưới dạng số nguyên hoặc dưới dạng số dấu phẩy động [hoặc số float]. Số nguyên là số chúng ta thường đếm với. Số float có phần thập phân [số thập phân]. Tiếp theo, hãy xem xét cách loại dữ liệu có thể tác động đến các hoạt động toán học trên dữ liệu của chúng ta. Phép cộng, phép trừ, phép chia và phép nhân hoạt động trên số float và số nguyên như chúng ta mong đợi
print[5+5]
type[surveys_df]
0type[surveys_df]
1type[surveys_df]
2Nếu chúng ta chia một số nguyên cho một số nguyên khác, chúng ta sẽ nhận được một số float. Kết quả trên Python 3 khác với Python 2, trong đó kết quả là một số nguyên [chia số nguyên]
type[surveys_df]
3type[surveys_df]
4type[surveys_df]
5type[surveys_df]
6Chúng ta cũng có thể chuyển đổi số dấu phẩy động thành số nguyên hoặc số nguyên thành số dấu phẩy động. Lưu ý rằng Python theo mặc định sẽ làm tròn xuống khi nó chuyển đổi từ dấu phẩy động sang số nguyên
type[surveys_df]
7type[surveys_df]
8type[surveys_df]
9pandas.core.frame.DataFrame
0Làm việc với dữ liệu khảo sát của chúng tôi
Quay trở lại dữ liệu của chúng tôi, chúng tôi có thể sửa đổi định dạng của các giá trị trong dữ liệu của mình, nếu chúng tôi muốn. Chẳng hạn, chúng ta có thể chuyển đổi trường
dtype['O']
2 thành giá trị dấu phẩy độngpandas.core.frame.DataFrame
1pandas.core.frame.DataFrame
2Thay đổi loại
Hãy thử chuyển đổi cột
3 thành float bằng cách sử dụngdtype['O']
3pandas.core.frame.DataFrame
Tiếp theo hãy thử chuyển đổi
4 thành một số nguyên. Có gì sai ở đây?dtype['O']
Thiếu giá trị dữ liệu - NaN
Điều gì đã xảy ra trong hoạt động thử thách cuối cùng? .
dtype['O']
5. Nếu chúng tôi nhìn vào cột dtype['O']
4 trong dữ liệu khảo sát, chúng tôi nhận thấy rằng có các giá trị NaN [Không phải là Số]. Giá trị NaN là giá trị không xác định không thể được biểu diễn bằng toán học. Ví dụ, gấu trúc sẽ đọc một ô trống trong trang tính CSV hoặc Excel dưới dạng NaN. NaN có một số thuộc tính mong muốn. nếu chúng ta tính trung bình cột dtype['O']
4 mà không thay thế các NaN của mình, Python sẽ biết bỏ qua các ô đópandas.core.frame.DataFrame
4pandas.core.frame.DataFrame
5Xử lý các giá trị dữ liệu bị thiếu luôn là một thách thức. Đôi khi rất khó để biết tại sao các giá trị bị thiếu - có phải do lỗi nhập dữ liệu không? . Nếu may mắn, chúng tôi có một số siêu dữ liệu sẽ cho chúng tôi biết thêm về cách xử lý các giá trị null
Chẳng hạn, trong một số lĩnh vực, như Viễn thám, các giá trị dữ liệu bị thiếu thường được định nghĩa là -9999. Có một loạt các giá trị -9999 trong dữ liệu của bạn thực sự có thể thay đổi các phép tính số. Thông thường trong bảng tính, các ô bị bỏ trống khi không có dữ liệu. Theo mặc định, gấu trúc sẽ thay thế các giá trị bị thiếu đó bằng NaN. Tuy nhiên, bạn nên tập thói quen đánh dấu có chủ ý các ô không có dữ liệu, không có giá trị dữ liệu. Bằng cách đó, sẽ không có câu hỏi nào trong tương lai khi bạn [hoặc người khác] khám phá dữ liệu của bạn
NaN ở đâu?
Hãy khám phá thêm một chút về các giá trị NaN trong dữ liệu của chúng tôi. Sử dụng các công cụ đã học ở bài 02, chúng ta có thể tính xem có bao nhiêu hàng chứa giá trị NaN cho trọng số. Chúng tôi cũng có thể tạo một tập hợp con mới từ dữ liệu của mình chỉ chứa các hàng có giá trị trọng số > 0 [i. e. , chọn giá trị trọng số có ý nghĩa]
pandas.core.frame.DataFrame
6Chúng ta có thể thay thế tất cả các giá trị NaN bằng các số 0 bằng cách sử dụng phương pháp
dtype['O']
8 [sau khi tạo một bản sao dữ liệu để không mất công]pandas.core.frame.DataFrame
7Tuy nhiên NaN và 0 mang lại kết quả phân tích khác nhau. Giá trị trung bình khi các giá trị NaN được thay thế bằng 0 khác với khi các giá trị NaN bị loại bỏ hoặc bỏ qua một cách đơn giản
pandas.core.frame.DataFrame
8pandas.core.frame.DataFrame
9Chúng tôi có thể điền các giá trị NaN với bất kỳ giá trị nào mà chúng tôi đã chọn. Mã bên dưới điền vào tất cả các giá trị NaN với giá trị trung bình cho tất cả các giá trị trọng số
surveys_df['sex'].dtype
0Chúng tôi cũng có thể chọn tạo một tập hợp con dữ liệu của mình, chỉ giữ các hàng không chứa giá trị NaN
Vấn đề là đưa ra quyết định có ý thức về cách quản lý dữ liệu bị thiếu. Đây là nơi chúng tôi nghĩ về cách dữ liệu của chúng tôi sẽ được sử dụng và những giá trị này sẽ tác động như thế nào đến các kết luận khoa học được đưa ra từ dữ liệu
Python cung cấp cho chúng tôi tất cả các công cụ mà chúng tôi cần để giải quyết những vấn đề này. Chúng ta chỉ cần thận trọng về cách các quyết định mà chúng ta đưa ra ảnh hưởng đến kết quả khoa học
Đếm
Đếm số lượng giá trị bị thiếu trên mỗi cột
Gợi ý
Phương pháp
9 cung cấp cho bạn số lượng quan sát không NA trên mỗi cột. Hãy thử tìm đến phương phápdtype['O']
0surveys_df['record_id'].dtype
Viết dữ liệu ra CSV
Chúng tôi đã học về cách sử dụng thao tác dữ liệu để có được đầu ra mong muốn. Nhưng chúng tôi cũng đã thảo luận về việc giữ dữ liệu đã được thao tác tách biệt với dữ liệu thô của chúng tôi. Một cái gì đó chúng tôi có thể quan tâm đến là chỉ làm việc với các cột có đầy đủ dữ liệu. Trước tiên, hãy tải lại dữ liệu để chúng tôi không trộn lẫn tất cả các thao tác trước đó của mình
surveys_df['sex'].dtype
1Tiếp theo, hãy bỏ tất cả các hàng chứa giá trị bị thiếu. Chúng ta sẽ sử dụng lệnh
surveys_df['record_id'].dtype
1. Theo mặc định, dropna sẽ xóa các hàng chứa dữ liệu bị thiếu cho dù chỉ một cộtsurveys_df['sex'].dtype
2Nếu bây giờ bạn gõ
surveys_df['record_id'].dtype
2, bạn sẽ thấy rằng DataFrame kết quả có 30676 hàng và 9 cột, nhỏ hơn nhiều so với 35549 hàng ban đầuBây giờ chúng ta có thể sử dụng lệnh
surveys_df['record_id'].dtype
3 để xuất DataFrame ở định dạng CSV. Lưu ý rằng mã bên dưới sẽ theo mặc định lưu dữ liệu vào thư mục làm việc hiện tại. Chúng tôi có thể lưu nó vào một thư mục khác bằng cách thêm tên thư mục và dấu gạch chéo trước tên tệp. surveys_df['record_id'].dtype
4. Chúng tôi sử dụng 'index=False' để gấu trúc không bao gồm số chỉ mục cho mỗi dòngsurveys_df['sex'].dtype
3Chúng tôi sẽ sử dụng tệp dữ liệu này sau trong hội thảo. Kiểm tra thư mục làm việc của bạn để đảm bảo CSV được viết đúng cách và bạn có thể mở nó. Nếu bạn muốn, hãy thử đưa nó trở lại Python để đảm bảo nó nhập đúng cách