gấu trúc thật tuyệt. Bạn có thể làm khá nhiều thứ với nó. từ làm sạch dữ liệu đến dữ liệu nhanh viz. Làm việc với từ điển lồng nhau từ tệp json thì sao?
gấu trúc. json_normalize có thể thực hiện hầu hết công việc cho bạn [hầu hết thời gian]. Tuy nhiên, json_normalize bị chậm khi bạn muốn làm phẳng một tệp json lớn. Ngoài ra, nó làm phẳng toàn bộ từ điển khi mục tiêu của bạn thực sự có thể là xây dựng khung dữ liệu của riêng bạn bằng cách trích xuất các khóa và giá trị đã chọn
Làm thế nào bạn có thể làm điều đó? . bóng tối. Xem bên dưới hướng dẫn từng bước
Đầu tiên, lấy dữ liệu. Đây là một từ điển lồng nhau đơn giản từ một tệp json mẫu
Thứ hai, nhập các thư viện python và nhập dữ liệu của chúng tôi [tôi. e. từ điển lồng nhau] vào một cột duy nhất của khung dữ liệu gấu trúc
Lưu ý1. ngoài pandas
và glom
, chúng tôi cũng sử dụng
['Given array:\n', [{'Mon': 2}, {'Tue': 11}, {'Wed': 3}]] ['Type of Object:\n', ] ['Flattened object:\n ', {'Wed': 3, 'Mon': 2, 'Tue': 11}] ['Type of flattened Object:\n', ]0 để chuyển đổi biểu diễn chuỗi của từ điển thành từ điển python [thuần túy]
Lưu ý 2. từ điển được lưu trữ dưới dạng một chuỗi
Thứ ba, trích xuất các khóa đã chọn và các giá trị tương ứng từ từ điển lồng nhau bằng cách sử dụng glom
và xây dựng khung dữ liệu của riêng bạn một cách nhanh chóng và hiệu quả. Trong ví dụ này, chúng tôi trích xuất khóa
['Given array:\n', [{'Mon': 2}, {'Tue': 11}, {'Wed': 3}]] ['Type of Object:\n', ] ['Flattened object:\n ', {'Wed': 3, 'Mon': 2, 'Tue': 11}] ['Type of flattened Object:\n', ]2 và chúng tôi lưu giá trị của nó vào một cột riêng biệt có cùng tên trong khung dữ liệu pandas
Việc sử dụng cơ bản của glom yêu cầu hai đối số chính. [i] dữ liệu và [ii] đường dẫn đến các khóa có giá trị mà chúng tôi muốn trích xuất và ghi vào khung dữ liệu. Để biết thêm thông tin và sử dụng trước, hãy xem hướng dẫn về glom trong tài liệu;]
Ở đây chúng tôi đã tạo một hàm python không sử dụng bất kỳ gói phụ thuộc nào để làm phẳng từ điển python. Các tham số được truyền cho hàm flatten_dict[] là từ điển mà bạn muốn làm phẳng
Chúng tôi có một danh sách có các phần tử là từ điển. Chúng ta cần làm phẳng nó để có được một từ điển duy nhất trong đó tất cả các phần tử danh sách này hiện diện dưới dạng các cặp khóa-giá trị
Với cho và cập nhật
Chúng tôi lấy một từ điển trống và thêm các phần tử vào đó bằng cách đọc các phần tử từ danh sách. Việc bổ sung các phần tử được thực hiện bằng chức năng cập nhật
Ví dụ
Bản thử trực tiếp
listA = [{'Mon':2}, {'Tue':11}, {'Wed':3}] # printing given arrays print["Given array:\n",listA] print["Type of Object:\n",type[listA]] res = {} for x in listA: res.update[x] # Result print["Flattened object:\n ", res] print["Type of flattened Object:\n",type[res]]
đầu ra
Chạy đoạn mã trên cho chúng ta kết quả sau -
['Given array:\n', [{'Mon': 2}, {'Tue': 11}, {'Wed': 3}]] ['Type of Object:\n', ] ['Flattened object:\n ', {'Wed': 3, 'Mon': 2, 'Tue': 11}] ['Type of flattened Object:\n', ]
với giảm
Chúng ta cũng có thể sử dụng hàm rút gọn cùng với hàm cập nhật để đọc các phần tử từ danh sách và thêm nó vào từ điển trống
Ví dụ
Bản thử trực tiếp
from functools import reduce listA = [{'Mon':2}, {'Tue':11}, {'Wed':3}] # printing given arrays print["Given array:\n",listA] print["Type of Object:\n",type[listA]] # Using reduce and update res = reduce[lambda d, src: d.update[src] or d, listA, {}] # Result print["Flattened object:\n ", res] print["Type of flattened Object:\n",type[res]]
đầu ra
Chạy đoạn mã trên cho chúng ta kết quả sau -
['Given array:\n', [{'Mon': 2}, {'Tue': 11}, {'Wed': 3}]] ['Type of Object:\n', ] ['Flattened object:\n ', {'Wed': 3, 'Mon': 2, 'Tue': 11}] ['Type of flattened Object:\n', ]
Với ChainMap
Hàm ChainMap sẽ đọc từng phần tử trong danh sách và tạo đối tượng bộ sưu tập mới chứ không phải từ điển
giả sử tôi có DataFrame sau
import pandas as pd
df = pd.DataFrame[{'events': [ [{'event_text': 'hello1'}, {'event_text': 'hello2'}],
[{'event_text': 'whats up?'}],
[{'event_text': 'all good'}, {'event_text': 'bye'}] ]}]
print[df]
events
0 [{'event_text': 'hello1'}, {'event_text': 'hel...
1 [{'event_text': 'whats up?'}]
2 [{'event_text': 'all good'}, {'event_text': 'b...
Tôi đang cố trích xuất tất cả các văn bản vào một cột duy nhất như vậy
0 hello1
1 hello2
2 whats up?
3 all good
4 bye
Tôi nghĩ rằng giải pháp liên quan đến json_normalize. Tôi đã thử như sau
from pandas.io.json import json_normalize
df['events'].apply[json_normalize]
Nhưng nó mang lại kết quả sau
0 event_text
0 hello1
1 hello2
1 event_text
0 whats up?
2 event_text
0 all good
1 bye
bất kỳ cách Pythonic nào để xử lý việc này?