Làm cách nào để chuyển đổi một chuỗi gấu trúc hoặc chỉ mục thành một mảng Numpy?


264

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?



Điều này có trả lời câu hỏi của bạn không? Chuyển đổi khung dữ liệu gấu trúc thành mảng NumPy
AMC

1
LƯU Ý: Việc phải chuyển đổi Pandas DataFrame thành một mảng (hoặc danh sách) như thế này có thể là dấu hiệu của các vấn đề khác. Tôi thực sự khuyên bạn nên đảm bảo rằng DataFrame là cấu trúc dữ liệu phù hợp cho trường hợp sử dụng cụ thể của bạn và Pandas không bao gồm bất kỳ cách nào để thực hiện các hoạt động bạn quan tâm.
AMC

Câu trả lời:


353

Để có được một mảng NumPy, bạn nên sử dụng valuesthuộ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.


Lưu ý: .valueskhô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 ?
AMC

Câu trả lời của cs95 đưa ra một lời giải thích tuyệt vời về .values, .to_numpy().array.
AMC

75

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.


Nó trả về instanceMethod và không phải là một mảng danh sách
V Shreyas

12
@VShreyas, thế còndf.index.values.tolist()
LancelotHolmes

3
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ế.
ayhan

51

gấu trúc> = 0,24

Khấu hao việc sử dụng của bạn .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, SeriesDataFrameđố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.valueshoặc DataFrame.values, nhưng chúng tôi rất khuyến khích và sử dụng .arrayhoặ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.


to_numpy() phương pháp

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 .arraykhông).


arrayThuộ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 SeriesIndexes được hỗ trợ bởi các mảng NumPy bình thường, Series.array sẽ trả về một cái mới arrays.PandasArray, đó là một trình bao bọc mỏng (không sao chép) xung quanh a numpy.ndarray. arrays.PandasArrayBả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, .arraysẽ trở lại

  1. Hiện tại ExtensionArrayủng hộ Index / Series, hoặc
  2. Nếu có một mảng NumPy sao lưu chuỗi, một ExtensionArrayđố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 GH19954GH23623 .

Cụ thể, các tài liệu đề cập đến lý do:

[...] với .valuesnó 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ới PeriodIndex, .values tạo ra một ndarrayđố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, .valuessẽ 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ể.


48

Nếu bạn đang xử lý một khung dữ liệu đa chỉ mục, bạn có thể quan tâm đến việc chỉ trích xuất cột của một tên của đa chỉ mục. Bạn có thể làm điều này như

df.index.get_level_values('name_sub_index')

và tất nhiên name_sub_indexphải là một yếu tố củaFrozenList df.index.names


16

Vì gấu trúc v0.13, bạn cũng có thể sử dụng get_values:

df.index.get_values()

5
Có sự khác biệt giữa giá trị này và. Giá trị? (Tôi đã cập nhật thông tin phiên bản, vì chức năng này xuất hiện từ các tài liệu 0.13.0.)
Andy Hayden

@Andy Hayden: Không phải là một sự khác biệt mà .get_values ​​là cách chính thức để chỉ nhận các giá trị hiện tại trong khi .values ​​(ví dụ: trên nhiều chỉ mục) có thể trả về các giá trị chỉ mục mà các hàng hoặc cột đã bị xóa?
Ezekiel Kruglick

@EzekielKruglick vì vậy nó luôn là bản sao? Các tài liệu được liên kết rất nhẹ, tôi không nghĩ bạn có được bản sao như thế (ngay cả khi họ ở MI, họ sẽ không ở .values) sẽ rất tuyệt khi xem một ví dụ minh họa điều này!
Andy Hayden

@AndyHayden: Tôi nghĩ rằng tôi đã đọc bình luận của bạn sai. Bạn nói đúng, .values ​​là tốt, .level đã lỗi thời và get_values ​​cung cấp cho bạn các giá trị hiện tại một cách chính xác, ngoại trừ các hàng / cols bị bỏ đi. Vấn đề github ban đầu: github.com/pydata/pandas/issues/3686 Nhưng tôi chỉ kiểm tra và có vẻ như .values ​​(tất nhiên!) Đưa ra thông tin cập nhật chỉ ở dạng khác so với tôi nghĩ là những gì chúng ta đang nói về
Ezekiel Kruglick

1
@AndyHayden Không, không có sự khác biệt. get_valueschỉ các cuộc gọi .values. Nó là nhiều ký tự để gõ.
cs95

0

Tôi đã chuyển đổi gấu trúc dataframethành listvà 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.


và sau đó sử dụng list.index () cơ bản liên quan đến câu hỏi chuyển đổi Sê-ri thành danh sách như thế nào?
AMC

0

Một cách gần đây hơn để làm điều này là sử dụng hàm .to_numpy ().

Nếu tôi có một khung dữ liệu với một cột 'giá', tôi có thể chuyển đổi nó như sau:

priceArray = df['price'].to_numpy()

Bạn cũng có thể truyền kiểu dữ liệu, chẳng hạn như float hoặc object, làm đối số của hàm


-1

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.


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 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. Đó thực sự không phải là lỗi của to_numpy.
AMC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.