Pandas DataFrame ไปยัง List of Lists


116

ง่ายต่อการเปลี่ยนรายชื่อเป็นกรอบข้อมูลแพนด้า:

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

แต่ฉันจะเปลี่ยน df กลับเป็นลิสต์ได้อย่างไร

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

คำตอบ:


179

คุณสามารถเข้าถึงอาร์เรย์พื้นฐานและเรียกtolistใช้เมธอด:

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

เหตุใดจึงมีการLต่อท้ายในเอาต์พุต
Kunal Vyas

1
L หมายถึงความยาวตรงข้ามกับ int
user48956

9
จาก v0.24 เป็นต้นไปมันจะดีกว่าที่จะใช้ df.to_numpy().tolist()
cs95

1
หมายเหตุนี่ไม่ได้รักษาการเรียงลำดับคอลัมน์ ดังนั้นระวังให้ดี
Russell Lego

3
ไม่มีเหตุผลใดที่จะไม่รักษาการเรียงลำดับคอลัมน์
Yohan Obadia

15

หากข้อมูลมีป้ายชื่อคอลัมน์และดัชนีที่คุณต้องการเก็บรักษาไว้มีตัวเลือกบางอย่าง

ตัวอย่างข้อมูล:

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

tolist()วิธีการที่อธิบายไว้ในคำตอบอื่น ๆ ที่เป็นประโยชน์ แต่อัตราผลตอบแทนเพียงข้อมูลหลัก - ซึ่งอาจจะไม่เพียงพอทั้งนี้ขึ้นอยู่กับความต้องการของคุณ

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

วิธีหนึ่งคือการแปลงเป็นDataFramejson โดยใช้df.to_json()แล้วแยกวิเคราะห์อีกครั้ง นี่เป็นเรื่องยุ่งยาก แต่มีข้อดีบางประการเนื่องจากto_json()วิธีนี้มีตัวเลือกที่เป็นประโยชน์

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

ยุ่งยาก แต่อาจมีประโยชน์

ข่าวดีก็คือการสร้างรายการสำหรับคอลัมน์และแถวนั้นค่อนข้างตรงไปตรงมา:

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

สิ่งนี้ให้ผล:

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

หากNoneเป็นชื่อของดัชนีที่น่ารำคาญให้เปลี่ยนชื่อ:

df = df.rename_axis('stage')

จากนั้น:

>>> 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
หากคุณมีดัชนีหลายระดับดัชนีทูเปิลจะเป็นองค์ประกอบแรกของแถวที่สร้างขึ้น คุณจะต้องมีขั้นตอนต่อไปเพื่อแยกมัน
Konstantin

มันจะไม่ง่ายกว่านี้DataFrame.itertuples()หรือDataFrame.to_records()สำหรับทั้งหมดนี้?
AMC

@AMC บางทีฉันไม่รู้อาจจะ? แทนที่จะเป็นสังฆราชทำไมไม่เพิ่มการปฏิบัติที่เหมาะสมของความคิดนั้นในคำตอบของคุณเอง?
Andrew E

@AndrewE เอ๊ะยังน่าคุยและปรับปรุงตามคำตอบที่มีอยู่
AMC

6

ฉันต้องการรักษาดัชนีดังนั้นฉันจึงปรับคำตอบเดิมสำหรับโซลูชันนี้:

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

ตอนนี้คุณสามารถวางไว้ที่อื่นได้ (เช่นวางในคำถาม Stack Overflow) แล้วสร้างใหม่:

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

5

ฉันไม่รู้ว่ามันจะตรงกับความต้องการของคุณหรือเปล่า แต่คุณสามารถทำได้:

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

นี่เป็นเพียงอาร์เรย์ numpy จากโมดูล ndarray ซึ่งช่วยให้คุณทำสิ่งต่างๆที่เป็นอาร์เรย์ numpy ตามปกติได้


1
บวก 1. ในทางปฏิบัติมักไม่จำเป็นต้องแปลงอาร์เรย์ NumPy เป็นรายการของรายการ
jpp


1

หมายเหตุ:ฉันเคยเห็นหลายกรณีใน Stack Overflow ที่การแปลง Pandas Series หรือ DataFrame เป็นอาร์เรย์ NumPy หรือรายการ Python ธรรมดานั้นไม่จำเป็นเลย หากคุณเพิ่งเริ่มใช้ไลบรารีให้ลองตรวจสอบอีกครั้งว่าฟังก์ชันที่คุณต้องการนั้นมีให้โดยวัตถุเหล่านั้น

หากต้องการเสนอความคิดเห็นโดย @jpp:

ในทางปฏิบัติมักไม่จำเป็นต้องแปลงอาร์เรย์ NumPy ให้เป็นลิสต์


หาก Pandas DataFrame / Series ไม่ทำงานคุณสามารถใช้บิวท์อินDataFrame.to_numpyและSeries.to_numpyวิธีการ


1
คำตอบนี้แสดงถึงความเชื่อของคุณเองเล็กน้อย และค่อนข้างตรงไปตรงมามันน่าอายเล็กน้อย มีเหตุผลที่ถูกต้องอย่างสมบูรณ์ในการแปลงดาต้าเฟรมเป็นรายการ / อาร์เรย์ผู้ใช้ขั้นสูงย่อมรู้ดี
Nicolas Gervais

@NicolasGervais มันอาจจะมากเกินไปใช่ฉันจะแก้ไขเพื่อให้สรุปน้อยลง มีเหตุผลที่ถูกต้องอย่างสมบูรณ์ในการแปลงดาต้าเฟรมเป็นรายการ / อาร์เรย์แน่นอนว่าคำตอบของฉันไม่ได้พูดอะไรในทางตรงกันข้าม ผู้ใช้ขั้นสูงย่อมรู้ดี ฉันไม่เห็นจุดของการกระทุ้งนั้น ฉันเขียนคำตอบนี้หลังจากสังเกตเห็นว่ามีคนจำนวนมากกำลังแปลงซีรีส์เป็น ndarrays หรือรายการและ ndarrays เป็นรายการเพียงเพราะพวกเขาไม่รู้ว่าการดำเนินการใดที่วัตถุเหล่านั้นรองรับ
AMC

ฉันหมายถึงกรณีที่ชัดเจนมากเช่นทำfor elem in some_series.values.tolist():เพราะพวกเขาไม่รู้ว่าคุณสามารถทำซ้ำในองค์ประกอบของซีรีส์ได้ ฉันไม่แน่ใจว่าคำตอบนี้แย่มาก
AMC

0

สิ่งนี้ง่ายมาก:

import numpy as np

list_of_lists = np.array(df)

วิธีนี้แตกต่างจากการใช้DataFrame.valuesหรือDataFrame.to_numpy()? ไม่ต้องกังวลว่าจะสร้างอาร์เรย์ NumPy ไม่ใช่รายการ Python ธรรมดา
AMC

0

"df.values" ส่งกลับอาร์เรย์จำนวนนับ สิ่งนี้ไม่ได้รักษาชนิดข้อมูลไว้ จำนวนเต็มอาจถูกแปลงเป็นทศนิยม

df.iterrows () ส่งคืนชุดข้อมูลซึ่งไม่รับประกันว่าจะรักษาชนิดข้อมูลไว้ด้วย ดู: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iterrows.html

โค้ดด้านล่างจะแปลงเป็นรายการและเก็บรักษาชนิดข้อมูลไว้:

rows = [list(row) for row in df.itertuples()]

-1

เราสามารถใช้ฟังก์ชัน DataFrame.iterrows () เพื่อวนซ้ำในแต่ละแถวของ Dataframe ที่กำหนดและสร้างรายการจากข้อมูลของแต่ละแถว:

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

เราสามารถแยกแต่ละแถวของกรอบข้อมูลที่กำหนดให้เป็นรายการได้สำเร็จ


นี่ไม่ใช่ความคิดที่ดีพยายามหลีกเลี่ยงการใช้ df.iterrows เนื่องจากเป็นการต่อต้านรูปแบบและช้าเมื่อ df มีขนาดใหญ่: stackoverflow.com/questions/16476924/…
Derek O
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.