Bạn có biết làm thế nào để lấy chỉ mục hoặc cột của DataFrame dưới dạng một mảng NumPy hoặc danh sách python không?
Bạn có biết làm thế nào để lấy chỉ mục hoặc cột của DataFrame dưới dạng một mảng NumPy hoặc danh sách python không?
Câu trả lời:
Để có được một mảng NumPy, bạn nên sử dụng values
thuộc tính:
In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c']); df
A B
a 1 4
b 2 5
c 3 6
In [2]: df.index.values
Out[2]: array(['a', 'b', 'c'], dtype=object)
Điều này truy cập cách dữ liệu đã được lưu trữ, do đó không cần chuyển đổi.
Lưu ý: Thuộc tính này cũng có sẵn cho nhiều đối tượng gấu trúc khác.
In [3]: df['A'].values
Out[3]: Out[16]: array([1, 2, 3])
Để lấy chỉ mục dưới dạng danh sách, hãy gọi tolist
:
In [4]: df.index.tolist()
Out[4]: ['a', 'b', 'c']
Và tương tự, cho các cột.
.values
không dùng nữa, .to_numpy()
là sự thay thế được đề xuất nếu bạn muốn một mảng NumPy. Bạn có thể mở rộng trên Điều này truy cập cách dữ liệu đã được lưu trữ, do đó không cần chuyển đổi ?
Bạn có thể sử dụng df.index
để truy cập đối tượng chỉ mục và sau đó lấy các giá trị trong danh sách bằng cách sử dụng df.index.tolist()
. Tương tự, bạn có thể sử dụng df['col'].tolist()
cho Series.
df.index.values.tolist()
df.index.tolist()
không trả về một phương thức cá thể. Nó trả về một danh sách các chỉ số. Đó là một phương pháp được xác định trên chỉ số gấu trúc. Mặc dù việc gọi các giá trị trước tiên là một khả năng, việc ủy thác công việc cho numpy không phải là một sự điều chỉnh - chỉ là một sự thay thế.
.values
ủng hộ các phương pháp này!Từ v0.24.0 trở đi, chúng ta sẽ có hai phương pháp thương hiệu spanking mới, ưu tiên cho việc thu thập các mảng NumPy từ Index
, Series
và DataFrame
đối tượng: họ là to_numpy()
, và .array
. Về việc sử dụng, các tài liệu đề cập:
Chúng tôi đã không loại bỏ hoặc phản đối
Series.values
hoặcDataFrame.values
, nhưng chúng tôi rất khuyến khích và sử dụng.array
hoặc.to_numpy()
thay vào đó.
Xem phần này của ghi chú phát hành v0.24.0 để biết thêm thông tin.
df.index.to_numpy()
# array(['a', 'b'], dtype=object)
df['A'].to_numpy()
# array([1, 4])
Theo mặc định, một khung nhìn được trả về. Bất kỳ sửa đổi được thực hiện sẽ ảnh hưởng đến bản gốc.
v = df.index.to_numpy()
v[0] = -1
df
A B
-1 1 2
b 4 5
Nếu bạn cần một bản sao thay thế, sử dụng to_numpy(copy=True
);
v = df.index.to_numpy(copy=True)
v[-1] = -123
df
A B
a 1 2
b 4 5
Lưu ý rằng chức năng này cũng hoạt động cho DataFrames (trong khi .array
không).
array
Thuộc tính Thuộc tính
này trả về mộtExtensionArray
đối tượng sao lưu Index / Series.
pd.__version__
# '0.24.0rc1'
# Setup.
df = pd.DataFrame([[1, 2], [4, 5]], columns=['A', 'B'], index=['a', 'b'])
df
A B
a 1 2
b 4 5
df.index.array
# <PandasArray>
# ['a', 'b']
# Length: 2, dtype: object
df['A'].array
# <PandasArray>
# [1, 4]
# Length: 2, dtype: int64
Từ đây, có thể lấy danh sách bằng cách sử dụng list
:
list(df.index.array)
# ['a', 'b']
list(df['A'].array)
# [1, 4]
hoặc, chỉ cần gọi trực tiếp .tolist()
:
df.index.tolist()
# ['a', 'b']
df['A'].tolist()
# [1, 4]
Về những gì được trả lại, các tài liệu đề cập đến,
Cho
Series
vàIndex
es được hỗ trợ bởi các mảng NumPy bình thường,Series.array
sẽ trả về một cái mớiarrays.PandasArray
, đó là một trình bao bọc mỏng (không sao chép) xung quanh anumpy.ndarray
.arrays.PandasArray
Bản thân nó không đặc biệt hữu ích, nhưng nó cung cấp giao diện giống như bất kỳ mảng mở rộng nào được xác định trong gấu trúc hoặc bởi thư viện của bên thứ ba.
Vì vậy, để tóm tắt, .array
sẽ trở lại
ExtensionArray
ủng hộ Index / Series, hoặcExtensionArray
đối tượng mới được tạo như một lớp bao bọc mỏng trên mảng bên dưới.Cơ sở lý luận để thêm HAI phương thức mới
Các chức năng này đã được thêm vào do kết quả của các cuộc thảo luận theo hai vấn đề GitHub GH19954 và GH23623 .
Cụ thể, các tài liệu đề cập đến lý do:
[...] với
.values
nó không rõ liệu giá trị được trả về sẽ là mảng thực tế, một số biến đổi của nó hoặc một trong các mảng tùy chỉnh gấu trúc (nhưCategorical
). Ví dụ, vớiPeriodIndex
,.values
tạo ra mộtndarray
đối tượng thời gian mới mỗi lần. [...]
Hai chức năng này nhằm cải thiện tính nhất quán của API, đây là một bước quan trọng theo đúng hướng.
Cuối cùng, .values
sẽ không bị phản đối trong phiên bản hiện tại, nhưng tôi hy vọng điều này có thể xảy ra vào một thời điểm nào đó trong tương lai, vì vậy tôi sẽ khuyến khích người dùng chuyển sang API mới hơn, ngay khi bạn có thể.
Vì gấu trúc v0.13, bạn cũng có thể sử dụng get_values
:
df.index.get_values()
get_values
chỉ các cuộc gọi .values
. Nó là nhiều ký tự để gõ.
Tôi đã chuyển đổi gấu trúc dataframe
thành list
và sau đó sử dụng cơ bản list.index()
. Một cái gì đó như thế này:
dd = list(zone[0]) #Where zone[0] is some specific column of the table
idx = dd.index(filename[i])
Bạn có giá trị chỉ số là idx
.
Dưới đây là một cách đơn giản để chuyển đổi cột dataframe thành mảng numpy.
df = pd.DataFrame(somedict)
ytrain = df['label']
ytrain_numpy = np.array([x for x in ytrain['label']])
ytrain_numpy là một mảng numpy.
Tôi đã thử với to.numpy()
nhưng nó đã cho tôi lỗi dưới đây:
TypeError: không hỗ trợ chuyển đổi cho các loại: (dtype ('O'),) trong khi thực hiện phân loại Binary Relevance bằng cách sử dụng tuyến tính SVC. to.numpy () đã chuyển đổi dataFrame thành mảng numpy nhưng kiểu dữ liệu của phần tử bên trong là danh sách vì đã quan sát thấy lỗi trên.
to_numpy
.