หลายครั้งที่ python จะได้รับข้อมูลจากแหล่งต่างๆ ซึ่งสามารถอยู่ในรูปแบบต่างๆ เช่น csv, JSON เป็นต้น ซึ่งสามารถแปลงเป็นรายการ python หรือพจนานุกรม เป็นต้น แต่หากต้องการใช้การคำนวณหรือการวิเคราะห์โดยใช้แพ็กเกจ เช่น pandas เราจำเป็นต้องแปลงข้อมูลนี้เป็น ดาต้าเฟรม ในบทความนี้ เราจะมาดูกันว่าเราจะแปลงรายการหลามที่กำหนดซึ่งมีองค์ประกอบเป็นพจนานุกรมที่ซ้อนกันเป็น Datframe ของแพนด้าได้อย่างไร
อันดับแรก เราใช้รายการพจนานุกรมที่ซ้อนกันและแยกแถวของข้อมูลออกมา จากนั้นเราสร้างอีก for loop เพื่อต่อท้ายแถวในรายการใหม่ซึ่งเดิมสร้างว่างเปล่า สุดท้าย เราใช้ฟังก์ชัน DataFrames ในไลบรารีแพนด้าเพื่อสร้าง Data Frame
ตัวอย่าง
import pandas as pd # Given nested dictionary list = [ { "Fruit": [{"Price": 15.2, "Quality": "A"}, {"Price": 19, "Quality": "B"}, {"Price": 17.8, "Quality": "C"}, ], "Name": "Orange" }, { "Fruit": [{"Price": 23.2, "Quality": "A"}, {"Price": 28, "Quality": "B"} ], "Name": "Grapes" } ] rows = [] # Getting rows for data in list: data_row = data['Fruit'] n = data['Name'] for row in data_row: row['Name'] = n rows.append(row) # Convert to data frame df = pd.DataFrame(rows) print(df)
การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -
ผลลัพธ์
Price Quality Name 0 15.2 A Orange 1 19.0 B Orange 2 17.8 C Orange 3 23.2 A Grapes 4 28.0 B Grapes
ใช้เดือย
เรายังใช้ฟังก์ชัน pivot_table เพื่อจัดระเบียบข้อมูลใหม่ได้ตามต้องการ
ตัวอย่าง
import pandas as pd # List of nested dictionary initialization list = [ { "Fruit": [{"Price": 15.2, "Quality": "A"}, {"Price": 19, "Quality": "B"}, {"Price": 17.8, "Quality": "C"}, ], "Name": "Orange" }, { "Fruit": [{"Price": 23.2, "Quality": "A"}, {"Price": 28, "Quality": "B"} ], "Name": "Grapes" } ] #print(list) rows = [] # appending rows for data in list: data_row = data['Fruit'] n = data['Name'] for row in data_row: row['Name'] = n rows.append(row) # using data frame df = pd.DataFrame(rows) df = df.pivot_table(index='Name', columns=['Quality'], values=['Price']).reset_index() print(df)
การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -
ผลลัพธ์
Name Price Quality A B C 0 Grapes 23.2 28.0 NaN 1 Orange 15.2 19.0 17.8