Hướng dẫn how do you represent a tabular data in python? - làm thế nào để bạn biểu diễn dữ liệu dạng bảng trong python?

Tổng quan

Giảng dạy: 45 phút Bài tập: 60 phút 45 min
Exercises: 60 min

Show

Câu hỏi

  • Làm cách nào để làm việc với dữ liệu số được trình bày trong bảng?

Mục tiêu

  • Sử dụng các chức năng trong

    [['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
     ['1' '8.9542' '5.8024' '11.5478' '9.9557']
     ['2' '8.6181' '6.0942' '13.9594' '11.6945']
     ...
     ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
     ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
     ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
    
    1 để đọc trong dữ liệu bảng.

  • Lấy các lát dữ liệu 2D trong các mảng numpy.

  • Sử dụng các lát 2D để làm việc với các hàng hoặc cột dữ liệu cụ thể.

  • Sử dụng hàm

    [['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
     ['1' '8.9542' '5.8024' '11.5478' '9.9557']
     ['2' '8.6181' '6.0942' '13.9594' '11.6945']
     ...
     ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
     ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
     ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
    
    2 trong các vòng
    [['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
     ['1' '8.9542' '5.8024' '11.5478' '9.9557']
     ['2' '8.6181' '6.0942' '13.9594' '11.6945']
     ...
     ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
     ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
     ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
    
    3.

  • Sử dụng các chức năng

    [['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
     ['1' '8.9542' '5.8024' '11.5478' '9.9557']
     ['2' '8.6181' '6.0942' '13.9594' '11.6945']
     ...
     ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
     ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
     ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
    
    1 để phân tích dữ liệu.

Hầu hết các nhà khoa học làm việc với rất nhiều dữ liệu số. Trong mô -đun này, chúng tôi sẽ tập trung vào việc đọc và phân tích dữ liệu số, trực quan hóa dữ liệu và làm việc với các mảng.

Đọc trong dữ liệu dạng bảng

Như chúng ta đã thảo luận, có nhiều cách để đọc trong dữ liệu từ các tệp trong Python. Trong mô -đun cuối cùng của chúng tôi, chúng tôi đã sử dụng hàm

[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
5 để đọc trong một tệp đầu ra phức tạp. Về lý thuyết, bạn luôn có thể sử dụng hàm
[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
5 và sau đó sử dụng các công cụ phân tích dữ liệu mà chúng tôi đã học trong mô -đun trước để định dạng dữ liệu khi bạn cần. Nhưng đôi khi có nhiều cách khác có ý nghĩa hơn, đặc biệt nếu dữ liệu là (1) tất cả hoặc chủ yếu là một loại dữ liệu (ví dụ: tất cả các số) và/hoặc (2) được định dạng trong bảng. Thông thường, một bảng sẽ chủ yếu là các số, nhưng có nhãn cột hoặc hàng.

Định dạng bảng phổ biến là tệp CSV hoặc các giá trị phân tách bằng dấu phẩy. Đây chính xác là những gì nó nghe như. Dữ liệu được trình bày thành hàng, với mỗi giá trị được phân tách bằng dấu phẩy. Nếu bạn có dữ liệu trong chương trình bảng tính mà bạn cần nhập vào mã Python, bạn có thể lưu dữ liệu dưới dạng CSVFile để đọc nó.

Trong ví dụ này, chúng tôi có một tệp CSV chứa dữ liệu từ quỹ đạo Động lực học phân tử. Chúng tôi có mô phỏng 20 ns sử dụng thời gian 2 FS. Dữ liệu được lưu vào tệp quỹ đạo cứ sau 1000 bước, vì vậy tệp của chúng tôi có 10.000 dấu thời gian. Ở mỗi dấu thời gian, chúng tôi quan tâm đến khoảng cách giữa các nguyên tử cụ thể. Những quỹ đạo này được tạo ra với chương trình Động lực học phân tử Amber và khoảng cách được đo bằng phân tích chương trình Python. Bảng khoảng cách nguyên tử đã được lưu dưới dạng tệp CVS có tên là Detcape Detcent_Data_headers.csv. Tệp này đã được tải xuống như một phần của tài liệu bài học của bạn. Mở tệp trong trình soạn thảo văn bản và nghiên cứu nó để xác định cấu trúc của nó.

Trong việc phân tích dữ liệu bảng, chúng ta thường cần thực hiện các loại tính toán tương tự (tính trung bình, tính toán tối thiểu hoặc tối đa của tập dữ liệu), vì vậy chúng ta một lần nữa sẽ sử dụng thư viện Python, lần này là một thư viện chứa nhiều chức năng để thực hiện các hoạt động toán học. Thư viện này được gọi là

[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
1. Thư viện
[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
1 có một số chức năng có sẵn để đọc trong dữ liệu bảng. Một trong những chức năng này là hàm
[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
9. Chúng tôi sẽ sử dụng chức năng
headers = distances[0]
print(headers)
0 để tìm hiểu thêm về
[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
9 và cách thức hoạt động của nó.library, this time a library that contains lots of functions to perform math operations. This library is called
[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
1. The
[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
1 library has several functions available to read in tabular data. One of these functions is the
[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
9 function. We will use the
headers = distances[0]
print(headers)
0 function to learn more about
[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
9 and how it works.

import numpy
help(numpy.genfromtxt)

Help on function genfromtxt in module numpy.lib.npyio:

genfromtxt(fname, dtype=, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')
    Load data from a text file, with missing values handled as specified.

    Each line past the first `skip_header` lines is split at the `delimiter`
    character, and characters following the `comments` character are discarded.

Menu Trợ giúp cho chúng ta thấy tất cả các tùy chọn chúng ta có thể sử dụng với chức năng này. Đầu vào đầu tiên

headers = distances[0]
print(headers)
2 là tên tệp chúng tôi đang đọc. Chúng tôi phải đặt một giá trị cho tùy chọn này vì nó không có giá trị mặc định. Tất cả các tùy chọn khác có giá trị mặc định được hiển thị sau = dấu. Chúng tôi chỉ cần chỉ định các tùy chọn này nếu chúng tôi không muốn sử dụng giá trị mặc định. Ví dụ: trong tệp của chúng tôi, tất cả các giá trị không phải là số nên chúng tôi không muốn sử dụng kiểu dữ liệu
headers = distances[0]
print(headers)
3, chúng tôi muốn sử dụng một cái gì đó khác. Nếu bạn có các kiểu dữ liệu hỗn hợp, như chúng tôi làm ở đây, chúng tôi muốn sử dụng
headers = distances[0]
print(headers)
4. Trong tập tin của chúng tôi, các giá trị của chúng tôi được phân tách bằng dấu phẩy; Chúng tôi chỉ ra rằng với
headers = distances[0]
print(headers)
5.

Học sinh thông minh có thể nhận thấy tùy chọn

headers = distances[0]
print(headers)
6, nơi bạn có thể chỉ định một số dòng cần bỏ qua khi bắt đầu tệp. Nếu chúng tôi làm điều này, thì tất cả các giá trị của chúng tôi sẽ là số và chúng tôi có thể sử dụng dtype = xông float, đó là mặc định. Trong ví dụ này, chúng tôi sẽ không làm điều đó bởi vì chúng tôi có thể muốn sử dụng các tiêu đề sau này để dán nhãn mọi thứ, nhưng hãy ghi nhớ tùy chọn này vì bạn có thể muốn sử dụng nó trong một dự án sau này.

Bây giờ chúng tôi đã có kế hoạch của mình, chúng tôi đã sẵn sàng nhập dữ liệu của chúng tôi với

[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
9.

Đầu tiên, chúng tôi phải có được đường dẫn đến tệp của chúng tôi. Hãy nhớ từ các bài học trước mà chúng tôi sử dụng mô -đun

headers = distances[0]
print(headers)
8 để làm điều này.

import os

distance_file = os.path.join('data', 'distance_data_headers.csv')

distances = numpy.genfromtxt(fname=distance_file, delimiter=',', dtype='unicode')
print(distances)

[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]

Đầu ra của chức năng này là một danh sách các danh sách; Đó là, mỗi hàng là một mục trong danh sách của chúng tôi, nhưng mỗi hàng tự nó là một danh sách các giá trị. Chúng ta có thể thấy rằng hàng đầu tiên là các tiêu đề cột của chúng ta và tất cả các hàng khác đều chứa dữ liệu số.

Nếu chúng ta đọc điều này với hàm readlines (), chúng ta sẽ phải phân chia từng dòng của tệp, sử dụng hàm

headers = distances[0]
print(headers)
9 để tạo một danh sách mới cho mỗi hàng, sau đó đặt tất cả các danh sách đó lại thành một danh sách . Sử dụng chức năng
[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
1 thích hợp làm cho cuộc sống của chúng ta dễ dàng hơn nhiều.

Thao tác dữ liệu bảng

Ngay cả bây giờ, chúng ta có thể thấy rằng dòng dữ liệu đầu tiên của chúng ta là các tiêu đề cho các cột của chúng ta và sẽ cần được lưu trữ dưới dạng chuỗi, trong khi tất cả phần còn lại của dữ liệu là số và sẽ cần được lưu trữ dưới dạng phao. Hãy để Lừa lấy một lát dữ liệu chỉ là tiêu đề.

headers = distances[0]
print(headers)

['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']

Kiểm tra việc hiểu của bạn

Lấy một lát của dữ liệu chỉ là các giá trị số. Để thống nhất cho các hoạt động sau này, hãy gọi dữ liệu lát này.

Câu trả lời

data = distances[1:]
print(data)

[['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ['3' '9.0066' '6.0637' '13.0924' '11.3043']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]

Mặc dù bây giờ chúng tôi có một danh sách các danh sách chỉ là các con số, nhưng tất cả các con số vẫn là chuỗi. Chúng tôi biết điều này bởi vì (1) chúng tôi đã đọc tất cả chúng dưới dạng Unicode và (2) nếu chúng tôi nhìn vào đầu ra của câu lệnh in, chúng tôi có thể thấy rằng mỗi số được đặt trong các trích dẫn đơn, cho biết đó là một chuỗi. Chúng ta cần phải lấy lại các giá trị này dưới dạng phao. Thư viện

[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
1 có chức năng tích hợp để thực hiện điều này. Trong trường hợp này, việc giữ một biến với tất cả các thông tin giống như các chuỗi không hữu ích cho chúng tôi, vì vậy đây là trường hợp chúng tôi sẽ ghi đè dữ liệu biến của chúng tôi.

data = data.astype(numpy.float)
print(data)

[[1.00000e+00 8.95420e+00 5.80240e+00 1.15478e+01 9.95570e+00]
 [2.00000e+00 8.61810e+00 6.09420e+00 1.39594e+01 1.16945e+01]
 [3.00000e+00 9.00660e+00 6.06370e+00 1.30924e+01 1.13043e+01]
 ...
 [9.99800e+03 8.66250e+00 7.73060e+00 9.54690e+00 1.03063e+01]
 [9.99900e+03 9.24560e+00 7.88860e+00 9.81510e+00 1.07564e+01]
 [1.00000e+04 8.81350e+00 7.91700e+00 9.95170e+00 1.07848e+01]]

Chúng tôi đã học cách giải quyết một yếu tố cụ thể của danh sách và cách lấy một lát danh sách để tạo một danh sách mới. Bây giờ chúng tôi có một mảng, bây giờ chúng tôi cần hai chỉ số để giải quyết một yếu tố cụ thể của mảng. Ký hiệu để giải quyết một phần tử của mảng luôn

Kiểm tra việc hiểu của bạn

Lấy một lát của dữ liệu chỉ là các giá trị số. Để thống nhất cho các hoạt động sau này, hãy gọi dữ liệu lát này.

Help on function genfromtxt in module numpy.lib.npyio:

genfromtxt(fname, dtype=, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')
    Load data from a text file, with missing values handled as specified.

    Each line past the first `skip_header` lines is split at the `delimiter`
    character, and characters following the `comments` character are discarded.
0

Câu trả lời

Mặc dù bây giờ chúng tôi có một danh sách các danh sách chỉ là các con số, nhưng tất cả các con số vẫn là chuỗi. Chúng tôi biết điều này bởi vì (1) chúng tôi đã đọc tất cả chúng dưới dạng Unicode và (2) nếu chúng tôi nhìn vào đầu ra của câu lệnh in, chúng tôi có thể thấy rằng mỗi số được đặt trong các trích dẫn đơn, cho biết đó là một chuỗi. Chúng ta cần phải lấy lại các giá trị này dưới dạng phao. Thư viện

[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
1 có chức năng tích hợp để thực hiện điều này. Trong trường hợp này, việc giữ một biến với tất cả các thông tin giống như các chuỗi không hữu ích cho chúng tôi, vì vậy đây là trường hợp chúng tôi sẽ ghi đè dữ liệu biến của chúng tôi.

Help on function genfromtxt in module numpy.lib.npyio:

genfromtxt(fname, dtype=, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')
    Load data from a text file, with missing values handled as specified.

    Each line past the first `skip_header` lines is split at the `delimiter`
    character, and characters following the `comments` character are discarded.
1

Help on function genfromtxt in module numpy.lib.npyio:

genfromtxt(fname, dtype=, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')
    Load data from a text file, with missing values handled as specified.

    Each line past the first `skip_header` lines is split at the `delimiter`
    character, and characters following the `comments` character are discarded.
2

Chúng tôi đã học cách giải quyết một yếu tố cụ thể của danh sách và cách lấy một lát danh sách để tạo một danh sách mới. Bây giờ chúng tôi có một mảng, bây giờ chúng tôi cần hai chỉ số để giải quyết một yếu tố cụ thể của mảng. Ký hiệu để giải quyết một phần tử của mảng luôn

Kiểm tra việc hiểu của bạn

Lấy một lát của dữ liệu chỉ là các giá trị số. Để thống nhất cho các hoạt động sau này, hãy gọi dữ liệu lát này.

Help on function genfromtxt in module numpy.lib.npyio:

genfromtxt(fname, dtype=, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')
    Load data from a text file, with missing values handled as specified.

    Each line past the first `skip_header` lines is split at the `delimiter`
    character, and characters following the `comments` character are discarded.
3

Câu trả lời

Mặc dù bây giờ chúng tôi có một danh sách các danh sách chỉ là các con số, nhưng tất cả các con số vẫn là chuỗi. Chúng tôi biết điều này bởi vì (1) chúng tôi đã đọc tất cả chúng dưới dạng Unicode và (2) nếu chúng tôi nhìn vào đầu ra của câu lệnh in, chúng tôi có thể thấy rằng mỗi số được đặt trong các trích dẫn đơn, cho biết đó là một chuỗi. Chúng ta cần phải lấy lại các giá trị này dưới dạng phao. Thư viện

[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
1 có chức năng tích hợp để thực hiện điều này. Trong trường hợp này, việc giữ một biến với tất cả các thông tin giống như các chuỗi không hữu ích cho chúng tôi, vì vậy đây là trường hợp chúng tôi sẽ ghi đè dữ liệu biến của chúng tôi.

Chúng tôi đã học cách giải quyết một yếu tố cụ thể của danh sách và cách lấy một lát danh sách để tạo một danh sách mới. Bây giờ chúng tôi có một mảng, bây giờ chúng tôi cần hai chỉ số để giải quyết một yếu tố cụ thể của mảng. Ký hiệu để giải quyết một phần tử của mảng luôn

Help on function genfromtxt in module numpy.lib.npyio:

genfromtxt(fname, dtype=, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')
    Load data from a text file, with missing values handled as specified.

    Each line past the first `skip_header` lines is split at the `delimiter`
    character, and characters following the `comments` character are discarded.
4

Đầu ra của các dòng mã này sẽ là gì?

Ở đó, bạn cũng có thể lấy các lát hai chiều của một mảng trong đó bạn chỉ định một loạt các hàng và một loạt các cột cho lát cắt. Ví dụ: đôi khi việc làm việc với một tập hợp dữ liệu nhỏ của chúng tôi để kiểm tra hơn là tập dữ liệu đầy đủ. Lệnh này có một lát cắt chỉ bao gồm mười hàng đầu tiên và ba cột đầu tiên của dữ liệu của chúng tôi.

Help on function genfromtxt in module numpy.lib.npyio:

genfromtxt(fname, dtype=, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')
    Load data from a text file, with missing values handled as specified.

    Each line past the first `skip_header` lines is split at the `delimiter`
    character, and characters following the `comments` character are discarded.
5

Hãy nhớ rằng việc đếm bắt đầu từ 0, vì vậy 0:10 có nghĩa là bắt đầu ở hàng 0 và bao gồm tất cả các hàng, cho đến nhưng không bao gồm 10. Giống như với các lát danh sách một chiều, nếu bạn không bao gồm một số trước

['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
2 Cắt lát tự động bắt đầu với
['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
3. Nếu bạn không bao gồm một số sau
['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
2, lát cắt sẽ đến cuối danh sách. Do đó, nếu bạn không bao gồm, một
['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
2 có nghĩa là mỗi hàng hoặc mỗi cột.

Help on function genfromtxt in module numpy.lib.npyio:

genfromtxt(fname, dtype=, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')
    Load data from a text file, with missing values handled as specified.

    Each line past the first `skip_header` lines is split at the `delimiter`
    character, and characters following the `comments` character are discarded.
6

Câu lệnh in đầu tiên chọn một hàng cụ thể và mỗi cột.

Câu lệnh in thứ hai chọn từng hàng và tất cả các cột ngoại trừ câu thứ nhất.

Phân tích dữ liệu bảng

Kiểm tra việc hiểu của bạn

Thư viện

[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
1 có nhiều chức năng tích hợp. Ví dụ: để tính toán trung bình (trung bình) của tập dữ liệu, cú pháp là

Câu trả lời

Mặc dù bây giờ chúng tôi có một danh sách các danh sách chỉ là các con số, nhưng tất cả các con số vẫn là chuỗi. Chúng tôi biết điều này bởi vì (1) chúng tôi đã đọc tất cả chúng dưới dạng Unicode và (2) nếu chúng tôi nhìn vào đầu ra của câu lệnh in, chúng tôi có thể thấy rằng mỗi số được đặt trong các trích dẫn đơn, cho biết đó là một chuỗi. Chúng ta cần phải lấy lại các giá trị này dưới dạng phao. Thư viện

[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
1 có chức năng tích hợp để thực hiện điều này. Trong trường hợp này, việc giữ một biến với tất cả các thông tin giống như các chuỗi không hữu ích cho chúng tôi, vì vậy đây là trường hợp chúng tôi sẽ ghi đè dữ liệu biến của chúng tôi.

Chúng tôi đã học cách giải quyết một yếu tố cụ thể của danh sách và cách lấy một lát danh sách để tạo một danh sách mới. Bây giờ chúng tôi có một mảng, bây giờ chúng tôi cần hai chỉ số để giải quyết một yếu tố cụ thể của mảng. Ký hiệu để giải quyết một phần tử của mảng luôn

Đầu ra của các dòng mã này sẽ là gì?

Help on function genfromtxt in module numpy.lib.npyio:

genfromtxt(fname, dtype=, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')
    Load data from a text file, with missing values handled as specified.

    Each line past the first `skip_header` lines is split at the `delimiter`
    character, and characters following the `comments` character are discarded.
8

Help on function genfromtxt in module numpy.lib.npyio:

genfromtxt(fname, dtype=, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')
    Load data from a text file, with missing values handled as specified.

    Each line past the first `skip_header` lines is split at the `delimiter`
    character, and characters following the `comments` character are discarded.
9

Ở đó, bạn cũng có thể lấy các lát hai chiều của một mảng trong đó bạn chỉ định một loạt các hàng và một loạt các cột cho lát cắt. Ví dụ: đôi khi việc làm việc với một tập hợp dữ liệu nhỏ của chúng tôi để kiểm tra hơn là tập dữ liệu đầy đủ. Lệnh này có một lát cắt chỉ bao gồm mười hàng đầu tiên và ba cột đầu tiên của dữ liệu của chúng tôi.

Hãy nhớ rằng việc đếm bắt đầu từ 0, vì vậy 0:10 có nghĩa là bắt đầu ở hàng 0 và bao gồm tất cả các hàng, cho đến nhưng không bao gồm 10. Giống như với các lát danh sách một chiều, nếu bạn không bao gồm một số trước

['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
2 Cắt lát tự động bắt đầu với
['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
3. Nếu bạn không bao gồm một số sau
['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
2, lát cắt sẽ đến cuối danh sách. Do đó, nếu bạn không bao gồm, một
['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
2 có nghĩa là mỗi hàng hoặc mỗi cột.

import os

distance_file = os.path.join('data', 'distance_data_headers.csv')

distances = numpy.genfromtxt(fname=distance_file, delimiter=',', dtype='unicode')
print(distances)
0

Câu lệnh in đầu tiên chọn một hàng cụ thể và mỗi cột.

Câu lệnh in thứ hai chọn từng hàng và tất cả các cột ngoại trừ câu thứ nhất.

import os

distance_file = os.path.join('data', 'distance_data_headers.csv')

distances = numpy.genfromtxt(fname=distance_file, delimiter=',', dtype='unicode')
print(distances)
1

Gợi ý: Bạn sẽ cần một vòng

[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
3 kép để đo khoảng cách giữa tất cả các nguyên tử. Nếu bạn không chắc chắn làm thế nào để bắt đầu, hãy in các biến bên trong vòng lặp của bạn.

Dung dịch

Đây là một giải pháp sử dụng hàm

data = distances[1:]
print(data)
9 để đọc trong dữ liệu. Có nhiều giải pháp khác có thể.

import os

distance_file = os.path.join('data', 'distance_data_headers.csv')

distances = numpy.genfromtxt(fname=distance_file, delimiter=',', dtype='unicode')
print(distances)
2

Đây là một giải pháp sử dụng

[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
5.

import os

distance_file = os.path.join('data', 'distance_data_headers.csv')

distances = numpy.genfromtxt(fname=distance_file, delimiter=',', dtype='unicode')
print(distances)
3

Tên biến

Trong giải pháp của chúng tôi ở trên, chúng tôi gọi là biến độ dài trái phiếu của chúng tôi

[['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ['3' '9.0066' '6.0637' '13.0924' '11.3043']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
1. Chúng tôi có thể gọi biến này bất cứ điều gì chúng tôi muốn. Hãy xem xét hai tên biến tiềm năng sau đây cho độ dài trái phiếu -
[['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ['3' '9.0066' '6.0637' '13.0924' '11.3043']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
2 và
[['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ['3' '9.0066' '6.0637' '13.0924' '11.3043']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
1. Cái nào rõ ràng hơn với bạn? Mặc dù bạn có thể biết
[['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ['3' '9.0066' '6.0637' '13.0924' '11.3043']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
4 có nghĩa là gì và những người khác có thể tìm ra nó thông qua bối cảnh, nhưng nó dễ dàng hơn đối với người khác nếu bạn đưa ra các biến của bạn tên rõ ràng.

Phần mở rộng dự án 1

Dự án ban đầu của bạn đã tính khoảng cách giữa mọi bộ nguyên tử. Tuy nhiên, một số nguyên tử này không thực sự gắn kết với nhau. H1 và H2 không được liên kết chẳng hạn, và tất cả khoảng cách giữa một nguyên tử và chính nó bằng không. Sử dụng mức cắt khoảng cách 1,5 angstroms để xác định liên kết (nghĩa là, nếu độ dài liên kết lớn hơn 1,5 angstroms, hãy xem xét các nguyên tử không liên kết). Sửa đổi mã của bạn để chỉ in các nguyên tử thực sự được liên kết với nhau.

Dung dịch

Đây là một giải pháp sử dụng hàm

data = distances[1:]
print(data)
9 để đọc trong dữ liệu. Có nhiều giải pháp khác có thể.

import os

distance_file = os.path.join('data', 'distance_data_headers.csv')

distances = numpy.genfromtxt(fname=distance_file, delimiter=',', dtype='unicode')
print(distances)
4

Đây là một giải pháp sử dụng

[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
5.

import os

distance_file = os.path.join('data', 'distance_data_headers.csv')

distances = numpy.genfromtxt(fname=distance_file, delimiter=',', dtype='unicode')
print(distances)
5

Tên biến

Trong giải pháp của chúng tôi ở trên, chúng tôi gọi là biến độ dài trái phiếu của chúng tôi

[['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ['3' '9.0066' '6.0637' '13.0924' '11.3043']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
1. Chúng tôi có thể gọi biến này bất cứ điều gì chúng tôi muốn. Hãy xem xét hai tên biến tiềm năng sau đây cho độ dài trái phiếu -
[['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ['3' '9.0066' '6.0637' '13.0924' '11.3043']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
2 và
[['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ['3' '9.0066' '6.0637' '13.0924' '11.3043']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
1. Cái nào rõ ràng hơn với bạn? Mặc dù bạn có thể biết
[['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ['3' '9.0066' '6.0637' '13.0924' '11.3043']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
4 có nghĩa là gì và những người khác có thể tìm ra nó thông qua bối cảnh, nhưng nó dễ dàng hơn đối với người khác nếu bạn đưa ra các biến của bạn tên rõ ràng.

Dung dịch

Phần mở rộng dự án 1

Dự án ban đầu của bạn đã tính khoảng cách giữa mọi bộ nguyên tử. Tuy nhiên, một số nguyên tử này không thực sự gắn kết với nhau. H1 và H2 không được liên kết chẳng hạn, và tất cả khoảng cách giữa một nguyên tử và chính nó bằng không. Sử dụng mức cắt khoảng cách 1,5 angstroms để xác định liên kết (nghĩa là, nếu độ dài liên kết lớn hơn 1,5 angstroms, hãy xem xét các nguyên tử không liên kết). Sửa đổi mã của bạn để chỉ in các nguyên tử thực sự được liên kết với nhau.

import os

distance_file = os.path.join('data', 'distance_data_headers.csv')

distances = numpy.genfromtxt(fname=distance_file, delimiter=',', dtype='unicode')
print(distances)
7

Thêm một câu lệnh [['1' '8.9542' '5.8024' '11.5478' '9.9557'] ['2' '8.6181' '6.0942' '13.9594' '11.6945'] ['3' '9.0066' '6.0637' '13.0924' '11.3043'] ... ['9998' '8.6625' '7.7306' '9.5469' '10.3063'] ['9999' '9.2456' '7.8886' '9.8151' '10.7564'] ['10000' '8.8135' '7.917' '9.9517' '10.7848']] 5 trước câu lệnh in của bạn.

Sản lượng của bạn bây giờ sẽ là

Dung dịch

Phần mở rộng dự án 2

import os

distance_file = os.path.join('data', 'distance_data_headers.csv')

distances = numpy.genfromtxt(fname=distance_file, delimiter=',', dtype='unicode')
print(distances)
8

Một số trong số này thực sự là cùng một độ dài trái phiếu; Ví dụ, O đến H1 và H1 đến O đề cập đến cùng độ dài liên kết. Xóa các bản sao khỏi danh sách của bạn.

import os

distance_file = os.path.join('data', 'distance_data_headers.csv')

distances = numpy.genfromtxt(fname=distance_file, delimiter=',', dtype='unicode')
print(distances)
9

import os

distance_file = os.path.join('data', 'distance_data_headers.csv')

distances = numpy.genfromtxt(fname=distance_file, delimiter=',', dtype='unicode')
print(distances)
6

[['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
 ['1' '8.9542' '5.8024' '11.5478' '9.9557']
 ['2' '8.6181' '6.0942' '13.9594' '11.6945']
 ...
 ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
 ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
 ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
0

Bây giờ đầu ra của bạn nên

  • Phần mở rộng dự án 3

  • Viết đầu ra của bạn vào một tệp văn bản có tên Bond_lengths.txt thay vì chỉ in nó ra màn hình.

  • Ở đâu đó bên ngoài vòng lặp

    [['Frame' 'THR4_ATP' 'THR4_ASP' 'TYR6_ATP' 'TYR6_ASP']
     ['1' '8.9542' '5.8024' '11.5478' '9.9557']
     ['2' '8.6181' '6.0942' '13.9594' '11.6945']
     ...
     ['9998' '8.6625' '7.7306' '9.5469' '10.3063']
     ['9999' '9.2456' '7.8886' '9.8151' '10.7564']
     ['10000' '8.8135' '7.917' '9.9517' '10.7848']]
    
    3 của bạn, hãy mở tệp để viết.

Làm thế nào để bạn hiển thị dữ liệu bảng trong Python?

Thư viện lập bảng trong Python Chúng tôi có thể sử dụng thư viện này để in dữ liệu bảng bằng Python và để làm như vậy, chúng tôi sử dụng lớp Tabulation bên trong thư viện Tabulation. Nó là một tiện ích dòng lệnh.use the tabulate class inside the tabulate library. It is a command line utility.

Làm thế nào để bạn viết dữ liệu ở dạng bảng trong Python?

Dữ liệu từ danh sách cũng có thể được in ở định dạng bảng ...
Sử dụng hàm định dạng () để in dữ liệu ở định dạng bảng trong Python ..
Sử dụng mô -đun Tabulation để in dữ liệu ở định dạng bảng trong Python ..
Sử dụng hàm pandas.dataframe () để in dữ liệu ở định dạng bảng trong Python ..

Làm thế nào để Python xử lý dữ liệu bảng?

Tabular là một gói các mô -đun Python để làm việc với dữ liệu bảng.Đối tượng chính của nó là lớp Tabarray, một cấu trúc dữ liệu để giữ và thao tác dữ liệu bảng.Bằng cách đặt dữ liệu vào một đối tượng Tabarray, bạn sẽ nhận được một đại diện cho dữ liệu linh hoạt và mạnh mẽ hơn so với biểu diễn Python bản địa.. Its main object is the tabarray class, a data structure for holding and manipulating tabular data. By putting data into a tabarray object, you'll get a representation of the data that is more flexible and powerful than a native Python representation.

Làm thế nào để bạn trình bày dữ liệu bảng?

Tổ chức dữ liệu bảng thành các hàng và cột.Mỗi hàng đại diện cho một bản ghi hoặc điểm dữ liệu duy nhất, trong khi các cột chứa thông tin liên quan đến bản ghi đó.Mỗi bản ghi hoặc hàng trong tập dữ liệu phải được xác định duy nhất bởi một hoặc nhiều cột kết hợp.. Each row represents a single record or data point, while columns contain information pertaining to that record. Each record or row in the data set should be uniquely identified by one or more columns in combination.