ฉันจะแปลงรายการพจนานุกรมเป็น DataFrame แพนด้าได้อย่างไร
คำตอบอื่น ๆ นั้นถูกต้อง แต่ไม่ได้อธิบายมากนักในแง่ของข้อดีและข้อ จำกัด ของวิธีการเหล่านี้ จุดประสงค์ของโพสต์นี้คือเพื่อแสดงตัวอย่างของวิธีการเหล่านี้ภายใต้สถานการณ์ที่แตกต่างกันอภิปรายว่าจะใช้เมื่อไร (และเมื่อใดที่จะไม่ใช้) และแนะนำทางเลือกอื่น ๆ
ขึ้นอยู่กับโครงสร้างและรูปแบบของข้อมูลของคุณมีสถานการณ์ที่ทั้งสามวิธีการทำงานหรือบางอย่างทำงานได้ดีกว่าคนอื่นหรือบางคนไม่ทำงานเลย
ลองพิจารณาตัวอย่างที่วางแผนไว้มาก
np.random.seed(0)
data = pd.DataFrame(
np.random.choice(10, (3, 4)), columns=list('ABCD')).to_dict('r')
print(data)
[{'A': 5, 'B': 0, 'C': 3, 'D': 3},
{'A': 7, 'B': 9, 'C': 3, 'D': 5},
{'A': 2, 'B': 4, 'C': 7, 'D': 6}]
รายการนี้ประกอบด้วย "บันทึก" ที่มีปุ่มทุกปุ่มอยู่ นี่เป็นกรณีที่ง่ายที่สุดที่คุณจะได้พบ
# The following methods all produce the same output.
pd.DataFrame(data)
pd.DataFrame.from_dict(data)
pd.DataFrame.from_records(data)
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
การวางแนวของ Word on Dictionary: orient='index'
/'columns'
ก่อนดำเนินการต่อเป็นสิ่งสำคัญที่จะต้องแยกความแตกต่างระหว่างการวางแนวพจนานุกรมที่แตกต่างกันและการสนับสนุนกับแพนด้า มีสองประเภทหลัก: "คอลัมน์" และ "ดัชนี"
orient='columns'
พจนานุกรมที่มีการวางแนว "คอลัมน์" จะมีกุญแจของพวกเขาสอดคล้องกับคอลัมน์ใน DataFrame ที่เทียบเท่า
ตัวอย่างเช่นdata
ข้างต้นอยู่ใน "คอลัมน์" ตะวันออก
data_c = [
{'A': 5, 'B': 0, 'C': 3, 'D': 3},
{'A': 7, 'B': 9, 'C': 3, 'D': 5},
{'A': 2, 'B': 4, 'C': 7, 'D': 6}]
pd.DataFrame.from_dict(data_c, orient='columns')
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
หมายเหตุ: หากคุณกำลังใช้pd.DataFrame.from_records
การวางแนวจะถือว่าเป็น "คอลัมน์" (คุณไม่สามารถระบุเป็นอย่างอื่นได้) และพจนานุกรมจะถูกโหลดตามนั้น
orient='index'
ด้วยทิศทางนี้คีย์จะถือว่าสอดคล้องกับค่าดัชนี pd.DataFrame.from_dict
ชนิดของข้อมูลนี้จะเหมาะที่สุดสำหรับ
data_i ={
0: {'A': 5, 'B': 0, 'C': 3, 'D': 3},
1: {'A': 7, 'B': 9, 'C': 3, 'D': 5},
2: {'A': 2, 'B': 4, 'C': 7, 'D': 6}}
pd.DataFrame.from_dict(data_i, orient='index')
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
กรณีนี้ไม่ได้พิจารณาใน OP แต่ก็ยังมีประโยชน์ที่จะรู้
การตั้งค่าดัชนีที่กำหนดเอง
หากคุณต้องการดัชนีที่กำหนดเองใน DataFrame ผลลัพธ์คุณสามารถตั้งค่าโดยใช้index=...
อาร์กิวเมนต์
pd.DataFrame(data, index=['a', 'b', 'c'])
# pd.DataFrame.from_records(data, index=['a', 'b', 'c'])
A B C D
a 5 0 3 3
b 7 9 3 5
c 2 4 7 6
pd.DataFrame.from_dict
นี้ไม่ได้รับการสนับสนุนโดย
การจัดการกับคีย์ / คอลัมน์ที่หายไป
วิธีการทั้งหมดทำงานนอกกรอบเมื่อจัดการพจนานุกรมด้วยค่าคีย์ / คอลัมน์ที่หายไป ตัวอย่างเช่น,
data2 = [
{'A': 5, 'C': 3, 'D': 3},
{'A': 7, 'B': 9, 'F': 5},
{'B': 4, 'C': 7, 'E': 6}]
# The methods below all produce the same output.
pd.DataFrame(data2)
pd.DataFrame.from_dict(data2)
pd.DataFrame.from_records(data2)
A B C D E F
0 5.0 NaN 3.0 3.0 NaN NaN
1 7.0 9.0 NaN NaN NaN 5.0
2 NaN 4.0 7.0 NaN 6.0 NaN
อ่านชุดย่อยของคอลัมน์
"จะเป็นอย่างไรถ้าฉันไม่ต้องการอ่านในทุกคอลัมน์" คุณสามารถระบุสิ่งนี้ได้อย่างง่ายดายโดยใช้columns=...
พารามิเตอร์
ตัวอย่างเช่นจากพจนานุกรมตัวอย่างdata2
ด้านบนหากคุณต้องการอ่านเฉพาะคอลัมน์ "A ',' D 'และ' F 'คุณสามารถทำได้โดยส่งรายการ:
pd.DataFrame(data2, columns=['A', 'D', 'F'])
# pd.DataFrame.from_records(data2, columns=['A', 'D', 'F'])
A D F
0 5.0 3.0 NaN
1 7.0 NaN 5.0
2 NaN NaN NaN
สิ่งนี้ไม่ได้รับการสนับสนุนจากpd.DataFrame.from_dict
"คอลัมน์" เริ่มต้น
pd.DataFrame.from_dict(data2, orient='columns', columns=['A', 'B'])
ValueError: cannot use columns parameter with orient='columns'
อ่านชุดย่อยของแถว
ไม่ได้รับการสนับสนุนโดยวิธีการใด ๆ เหล่านี้โดยตรง คุณจะต้องวนซ้ำข้อมูลของคุณและทำการลบย้อนกลับในสถานที่ในขณะที่คุณทำซ้ำ ยกตัวอย่างเช่นในการสกัดเพียง 0 วันที่ 2 และครั้งที่แถวจากdata2
ข้างต้นคุณสามารถใช้:
rows_to_select = {0, 2}
for i in reversed(range(len(data2))):
if i not in rows_to_select:
del data2[i]
pd.DataFrame(data2)
# pd.DataFrame.from_dict(data2)
# pd.DataFrame.from_records(data2)
A B C D E
0 5.0 NaN 3 3.0 NaN
1 NaN 4.0 7 NaN 6.0
ยาครอบจักรวาล: json_normalize
สำหรับข้อมูลที่ซ้อนกัน
ทางเลือกที่แข็งแกร่งและมีประสิทธิภาพสำหรับวิธีการที่อธิบายไว้ข้างต้นคือjson_normalize
ฟังก์ชันที่ทำงานกับรายการพจนานุกรม (บันทึก) และนอกจากนี้ยังสามารถจัดการพจนานุกรมที่ซ้อนกันได้อีกด้วย
pd.io.json.json_normalize(data)
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
pd.io.json.json_normalize(data2)
A B C D E
0 5.0 NaN 3 3.0 NaN
1 NaN 4.0 7 NaN 6.0
อีกครั้งโปรดจำไว้ว่าข้อมูลที่ส่งผ่านไปยังjson_normalize
จำเป็นต้องอยู่ในรูปแบบ list-of-dictionaries (records)
ดังกล่าวjson_normalize
ยังสามารถจัดการพจนานุกรมที่ซ้อนกัน นี่คือตัวอย่างที่นำมาจากเอกสาร
data_nested = [
{'counties': [{'name': 'Dade', 'population': 12345},
{'name': 'Broward', 'population': 40000},
{'name': 'Palm Beach', 'population': 60000}],
'info': {'governor': 'Rick Scott'},
'shortname': 'FL',
'state': 'Florida'},
{'counties': [{'name': 'Summit', 'population': 1234},
{'name': 'Cuyahoga', 'population': 1337}],
'info': {'governor': 'John Kasich'},
'shortname': 'OH',
'state': 'Ohio'}
]
pd.io.json.json_normalize(data_nested,
record_path='counties',
meta=['state', 'shortname', ['info', 'governor']])
name population state shortname info.governor
0 Dade 12345 Florida FL Rick Scott
1 Broward 40000 Florida FL Rick Scott
2 Palm Beach 60000 Florida FL Rick Scott
3 Summit 1234 Ohio OH John Kasich
4 Cuyahoga 1337 Ohio OH John Kasich
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับmeta
และrecord_path
ข้อโต้แย้งตรวจสอบเอกสารประกอบ
สรุป
นี่คือตารางของวิธีการทั้งหมดที่กล่าวถึงข้างต้นพร้อมกับคุณสมบัติ / ฟังก์ชันการทำงานที่รองรับ
* ใช้orient='columns'
แล้ว transpose orient='index'
ที่จะได้รับผลเช่นเดียวกับ