Dữ liệu gấu trúc (Pandas DataFrame to List of List)


114

Thật dễ dàng để biến một danh sách danh sách thành khung dữ liệu gấu trúc:

import pandas as pd
df = pd.DataFrame([[1,2,3],[3,4,5]])

Nhưng làm cách nào để biến df trở lại thành một list danh sách?

lol = df.what_to_do_now?
print lol
# [[1,2,3],[3,4,5]]

Câu trả lời:


176

Bạn có thể truy cập vào mảng bên dưới và gọi tolistphương thức của nó :

>>> df = pd.DataFrame([[1,2,3],[3,4,5]])
>>> lol = df.values.tolist()
>>> lol
[[1L, 2L, 3L], [3L, 4L, 5L]]

Tại sao có Lthêm s trong đầu ra?
Kunal Vyas

1
L có nghĩa là dài, trái ngược với int.
user48956


1
LƯU Ý, điều này không bảo toàn thứ tự cột. vì vậy hãy chú ý điều đó
Russell Lego

3
Không có lý do gì mà nó không bảo toàn thứ tự cột.
Yohan Obadia

15

Nếu dữ liệu có nhãn cột và chỉ mục mà bạn muốn giữ lại, có một vài tùy chọn.

Dữ liệu mẫu:

>>> df = pd.DataFrame([[1,2,3],[3,4,5]], \
       columns=('first', 'second', 'third'), \
       index=('alpha', 'beta')) 
>>> df
       first  second  third
alpha      1       2      3
beta       3       4      5

Các tolist()phương pháp được mô tả trong câu trả lời khác là hữu ích nhưng sản lượng chỉ có dữ liệu cốt lõi - mà có thể không đủ, tùy thuộc vào nhu cầu của bạn.

>>> df.values.tolist()
[[1, 2, 3], [3, 4, 5]]

Một cách tiếp cận là chuyển đổi DataFramesang json bằng cách sử dụng df.to_json()và sau đó phân tích cú pháp lại. Điều này là rườm rà nhưng có một số lợi thế, bởi vì to_json()phương pháp này có một số tùy chọn hữu ích.

>>> df.to_json()
{
  "first":{"alpha":1,"beta":3},
  "second":{"alpha":2,"beta":4},"third":{"alpha":3,"beta":5}
}

>>> df.to_json(orient='split')
{
 "columns":["first","second","third"],
 "index":["alpha","beta"],
 "data":[[1,2,3],[3,4,5]]
}

Rắc rối nhưng có thể hữu ích.

Tin tốt là việc xây dựng danh sách cho các cột và hàng khá đơn giản:

>>> columns = [df.index.name] + [i for i in df.columns]
>>> rows = [[i for i in row] for row in df.itertuples()]

Điều này mang lại:

>>> print(f"columns: {columns}\nrows: {rows}") 
columns: [None, 'first', 'second', 'third']
rows: [['alpha', 1, 2, 3], ['beta', 3, 4, 5]]

Nếu Nonetên của chỉ mục gây khó chịu, hãy đổi tên nó:

df = df.rename_axis('stage')

Sau đó:

>>> columns = [df.index.name] + [i for i in df.columns]
>>> print(f"columns: {columns}\nrows: {rows}") 

columns: ['stage', 'first', 'second', 'third']
rows: [['alpha', 1, 2, 3], ['beta', 3, 4, 5]]

1
Nếu bạn có một chỉ mục đa cấp, bộ chỉ mục sẽ là phần tử đầu tiên của các hàng được tạo. Bạn sẽ cần một bước nữa để tách nó.
Konstantin

Nó sẽ không đơn giản hơn để sử dụng DataFrame.itertuples()hoặc DataFrame.to_records()cho tất cả những điều này?
AMC

@AMC Có lẽ, tôi không biết, có thể? Thay vì chỉ trích giáo hoàng, tại sao không thêm một cách xử lý thích hợp cho suy nghĩ đó trong câu trả lời của riêng bạn?
Andrew E

@AndrewE Ơ, nó vẫn đáng thảo luận và cải thiện dựa trên các câu trả lời hiện có.
AMC

5

Tôi không biết liệu nó có phù hợp với nhu cầu của bạn hay không, nhưng bạn cũng có thể làm:

>>> lol = df.values
>>> lol
array([[1, 2, 3],
       [3, 4, 5]])

Đây chỉ là một mảng numpy từ mô-đun ndarray, cho phép bạn thực hiện tất cả những thứ thông thường của mảng numpy.


1
Cộng 1. Trong thực tế , thường không cần chuyển đổi mảng NumPy thành một danh sách danh sách.
jpp

5

Tôi muốn bảo toàn chỉ mục, vì vậy tôi đã điều chỉnh câu trả lời ban đầu cho giải pháp này:

list_df = df.reset_index().values.tolist()

Bây giờ bạn có thể dán nó vào một nơi khác (ví dụ: dán vào câu hỏi Stack Overflow) và sau đó tạo lại nó:

pd.Dataframe(list_df, columns=['name1', ...])
pd.set_index(['name1'], inplace=True)

2

Có thể điều gì đó đã thay đổi nhưng điều này đã trả lại một danh sách các ndarrays đã làm những gì tôi cần.

list(df.values)

1

Lưu ý: Tôi đã thấy nhiều trường hợp trên Stack Overflow trong đó việc chuyển đổi Chuỗi Pandas hoặc DataFrame thành mảng NumPy hoặc danh sách Python thuần túy là hoàn toàn không cần thiết. Nếu bạn là người mới sử dụng thư viện, hãy xem xét kiểm tra kỹ xem chức năng bạn cần đã được cung cấp bởi các đối tượng Pandas đó chưa.

Để trích dẫn một bình luận của @jpp:

Trong thực tế , thường không cần chuyển đổi mảng NumPy thành một danh sách danh sách.


Nếu Pandas DataFrame / Series không hoạt động, bạn có thể sử dụng các phương pháp DataFrame.to_numpySeries.to_numpyphương pháp tích hợp sẵn.


1
Câu trả lời này thể hiện nhiều hơn niềm tin của chính bạn. Và khá thẳng thắn, đó là một chút xấu hổ. Có những lý do hoàn toàn hợp lệ để chuyển đổi khung dữ liệu thành danh sách / mảng, người dùng nâng cao chắc chắn sẽ biết.
Nicolas Gervais

@NicolasGervais Nó có thể hơi quá, vâng, tôi sẽ chỉnh sửa nó để khái quát ít hơn. Có những lý do hoàn toàn hợp lệ để chuyển đổi khung dữ liệu thành danh sách / mảng Tất nhiên, câu trả lời của tôi không thực sự nói lên điều gì ngược lại. một người dùng nâng cao chắc chắn sẽ biết. Tôi không hiểu điểm của cú đâm đó. Tôi đã viết câu trả lời này sau khi nhận thấy rằng nhiều người đang chuyển đổi chuỗi thành ndarrays hoặc danh sách, và ndarrays thành danh sách, đơn giản vì họ không biết những hoạt động nào mà các đối tượng đó hỗ trợ.
AMC

Tôi đang đề cập đến những trường hợp rất trắng trợn, giống như làm for elem in some_series.values.tolist():vì họ không biết rằng bạn có thể lặp lại các phần tử của một chuỗi. Tôi không chắc câu trả lời này có gì khủng khiếp.
AMC

0

Điều này rất đơn giản:

import numpy as np

list_of_lists = np.array(df)

Điều này khác với việc sử dụng DataFrame.valueshoặc DataFrame.to_numpy()? Đừng bận tâm đến thực tế là nó tạo ra một mảng NumPy, không phải là một danh sách Python thuần túy.
AMC

-1

Chúng ta có thể sử dụng hàm DataFrame.iterrows () để lặp qua từng hàng của Dataframe đã cho và tạo danh sách từ dữ liệu của mỗi hàng:

# Empty list 
row_list =[] 

# Iterate over each row 
for index, rows in df.iterrows(): 
    # Create list for the current row 
    my_list =[rows.Date, rows.Event, rows.Cost] 

    # append the list to the final list 
    row_list.append(my_list) 

# Print 
print(row_list) 

Chúng tôi có thể trích xuất thành công từng hàng của khung dữ liệu đã cho thành một danh sách


Đây không phải là một ý kiến ​​hay, hãy cố gắng tránh sử dụng df.iterrows vì nó phản mẫu và chậm khi df trở nên lớn: stackoverflow.com/questions/16476924/…
Derek O
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.