DataFrame đầu vào "df" như sau (lưu ý giá trị trong cột 'id'):
| id | tên |
|-------|------------------------------------------------ -------------------------------------------------- |
| a1xy | [ { "sự kiện": "thể thao", "bắt đầu": "100"}, { "sự kiện": "bữa trưa", "bắt đầu": "121" } ] |
a7yz | [ { "sự kiện": "bữa trưa", "bắt đầu": "109"}, { "sự kiện": "phim", "bắt đầu": "97" } ] |
bx4y | [ { "sự kiện": "bữa tối", "bắt đầu": "78"}, { "sự kiện": "ngủ", "bắt đầu": "25" } ] |
Tôi muốn làm phẳng các phần tử mảng JSON để kết quả đầu ra của tôi là:
| id | tên.sự kiện |
|-------|-------------||-------------|
| thể thao 100 |
| ăn trưa |
| ăn trưa 109 |
| phim a7yz |
| bữa tối 78 |
|
Các giá trị trong cột "id" cần được ánh xạ chính xác. Làm cách nào để thực hiện việc này bằng Python?
我试过:
k = df.name.map(json.loads).apply(pd.DataFrame).tolist()
cuối cùng_df = pd.concat(k)
Nhưng tôi không thể ánh xạ giá trị trong cột "id".
Bạn có thể sử dụng tính năng hiểu danh sách, làm phẳng và chuyển NHẬN DẠNG
value cập nhật từng từ điển và cuối cùng gọi Khung dữ liệu
Người xây dựng:
df['name'] = df['name'].map(json.loads)
df = pd.DataFrame([dict(y, id=i) for i, x in zip(df['id'],df['name']) for y in x])
print (df)
bắt đầu id sự kiện
0 thể thao a1xy 100
1 bữa trưa a1xy 121
2 bữa trưa a7yz 109
3 phim a7yz 97
4 bữa tối bx4y 78
5 ngủ bx4y 25
Nhưng nếu đầu vào làjson
, tốt nhất nên sử dụngjson_n normalize
.
thời gian:
df=pd.DataFrame([
['a1xy',[{ "sự kiện": "thể thao", "bắt đầu": "100"}, { "sự kiện": "bữa trưa", "bắt đầu": "121" } ]],
['a7yz',[{ "sự kiện": "bữa trưa", "bắt đầu": "109"}, { "sự kiện": "phim", "bắt đầu": "97" } ]],
['bx4y',[{ "sự kiện": "bữa tối", "bắt đầu": "78"}, { "sự kiện": "ngủ", "bắt đầu": "25" } ]]],
cột=['id','name'])
print (df)
#3k hàng
df = pd.concat([df] * 1000, ign_index=True)
Trong [276]: %%timeit
...: pd.DataFrame([dict(y, id=i) for i, x in zip(df['id'],df['name']) for y in x])
9,49 ms ± 230 µs trên mỗi vòng lặp (trung bình ± std. dev. của 7 lần chạy, mỗi lần 100 vòng)
Trong [277]: %%timeit
...: cuối cùngArray=[]
...: df.apply(lambda x: addtoArray(x,finalArray),axis=1)
...: pd.DataFrame(finalArray,columns=['col1','event','start'])
...:
1,81 giây ± 33,9 ms mỗi vòng lặp (trung bình ± std. dev. của 7 lần chạy, mỗi lần 1 vòng lặp)
Giải pháp hiểu danh sách 180x
Nhanh hơn.
Tôi là một lập trình viên xuất sắc, rất giỏi!