Pandas DataFrame ke Daftar Daftar

115

Sangat mudah untuk mengubah daftar menjadi bingkai data panda:

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

Tapi bagaimana cara mengubah df kembali menjadi daftar daftar?

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

Jawaban:

178

Anda dapat mengakses array yang mendasarinya dan memanggil tolistmetodenya:

>>> df = pd.DataFrame([[1,2,3],[3,4,5]])
>>> lol = df.values.tolist()
>>> lol
[[1L, 2L, 3L], [3L, 4L, 5L]]
DSM
sumber
Mengapa ada Lyang ditambahkan dalam output?
Kunal Vyas
1
L berarti panjang, bukan int.
pengguna48956
9
Mulai v0.24 dan seterusnya, akan lebih baik jika digunakandf.to_numpy().tolist() .
cs95
1
CATATAN, ini tidak mempertahankan urutan kolom. jadi hati-hatilah untuk itu
Russell Lego
3
Tidak ada alasan mengapa tidak mempertahankan urutan kolom.
Yohan Obadia
15

Jika data memiliki label kolom dan indeks yang ingin Anda pertahankan, ada beberapa opsi.

Contoh data:

>>> 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

The tolist()metode yang dijelaskan dalam jawaban lainnya berguna tetapi hanya menghasilkan data inti - yang mungkin tidak cukup, tergantung pada kebutuhan Anda.

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

Salah satu pendekatannya adalah dengan mengonversi DataFramemenjadi json menggunakan df.to_json()dan kemudian menguraikannya lagi. Ini rumit tetapi memiliki beberapa keuntungan, karena to_json()metode ini memiliki beberapa opsi yang berguna.

>>> 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]]
}

Praktis tapi semoga bermanfaat.

Kabar baiknya adalah cukup mudah untuk membuat daftar untuk kolom dan baris:

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

Ini menghasilkan:

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

Jika Nonesebagai nama indeks mengganggu, ganti namanya:

df = df.rename_axis('stage')

Kemudian:

>>> 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]]
Andrew E
sumber
1
Jika Anda memiliki indeks bertingkat, tupel indeks akan menjadi elemen pertama dari baris yang dibuat. Anda memerlukan langkah lebih lanjut untuk membaginya.
Konstantin
Bukankah lebih sederhana untuk menggunakan DataFrame.itertuples()atau DataFrame.to_records()untuk semua ini?
AMC
@AMC Mungkin, saya tidak tahu, mungkin? Alih-alih menjadi kepausan, mengapa tidak menambahkan perawatan yang tepat untuk pikiran itu dalam jawaban Anda sendiri?
Andrew E
@AndrewE Eh, masih ada gunanya mendiskusikan dan meningkatkan jawaban yang ada.
AMC
5

Saya tidak tahu apakah itu sesuai dengan kebutuhan Anda, tetapi Anda juga dapat melakukan:

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

Ini hanyalah array numpy dari modul ndarray, yang memungkinkan Anda melakukan semua hal array numpy biasa.

aps
sumber
1
Plus 1. Dalam praktiknya , sering kali tidak perlu mengubah larik NumPy menjadi daftar daftar.
jpp
5

Saya ingin mempertahankan indeks, jadi saya menyesuaikan jawaban asli untuk solusi ini:

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

Sekarang Anda dapat menempelkannya di tempat lain (misalnya untuk menempelkan ke pertanyaan Stack Overflow) dan kemudian membuatnya kembali:

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

Mungkin ada sesuatu yang berubah tetapi ini mengembalikan daftar ndarrays yang melakukan apa yang saya butuhkan.

list(df.values)
Ian Rubenstein
sumber
1

Catatan: Saya telah melihat banyak kasus di Stack Overflow di mana mengonversi Seri Pandas atau DataFrame ke array NumPy atau daftar Python biasa sama sekali tidak diperlukan. Jika Anda baru mengenal pustaka, pertimbangkan untuk memeriksa ulang apakah fungsionalitas yang Anda perlukan sudah ditawarkan oleh objek Pandas tersebut.

Mengutip komentar oleh @jpp:

Dalam praktiknya , sering kali tidak perlu mengonversi larik NumPy menjadi daftar daftar.


Jika Pandas DataFrame / Series tidak berfungsi, Anda dapat menggunakan metode DataFrame.to_numpydan bawaan Series.to_numpy.

AMC
sumber
1
Jawaban ini mewakili sedikit lebih dari keyakinan Anda sendiri. Dan sejujurnya, ini sedikit memalukan. Ada alasan yang sangat valid untuk mengonversi kerangka data menjadi daftar / larik, pengguna tingkat lanjut pasti akan tahu.
Nicolas Gervais
@NicolasGervais Ini mungkin terlalu banyak, ya, saya akan mengeditnya untuk mengurangi generalisasi. Ada alasan yang sangat valid untuk mengonversi kerangka data menjadi daftar / larik. Tentu saja, jawaban saya tidak benar-benar mengatakan sebaliknya. pengguna tingkat lanjut pasti tahu. Saya tidak mengerti maksud dari pukulan itu. Saya menulis jawaban ini setelah memperhatikan bahwa banyak orang mengonversi rangkaian ke ndarrays atau list, dan ndarrays menjadi list, hanya karena mereka tidak mengetahui operasi apa yang didukung objek tersebut.
AMC
Saya mengacu pada kasus yang sangat mencolok, seperti melakukan for elem in some_series.values.tolist():karena mereka tidak tahu bahwa Anda dapat mengulang elemen rangkaian. Saya tidak yakin apa yang mengerikan tentang jawaban ini.
AMC
0

Ini sangat sederhana:

import numpy as np

list_of_lists = np.array(df)
Tms91
sumber
Apa bedanya dengan menggunakan DataFrame.valuesatau DataFrame.to_numpy()? Tidak peduli fakta bahwa itu membuat array NumPy, bukan daftar Python biasa.
AMC
-1

Kita bisa menggunakan fungsi DataFrame.iterrows () untuk mengulangi setiap baris dari Dataframe yang diberikan dan membuat daftar dari data setiap baris:

# 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) 

Kami berhasil mengekstrak setiap baris dari bingkai data yang diberikan ke dalam daftar

Ram Prajapati
sumber
Ini bukan ide yang baik, coba hindari menggunakan df.iterrows karena anti-pola dan lambat setelah df menjadi besar: stackoverflow.com/questions/16476924/…
Derek O