Tạo DataFrame cho gấu trúc từ danh sách các bộ giá trị (hàng, cột, giá trị)


81

Tôi có một danh sách các bộ giá trị như

data = [
('r1', 'c1', avg11, stdev11),
('r1', 'c2', avg12, stdev12),
('r2', 'c1', avg21, stdev21),
('r2', 'c2', avg22, stdev22)
]

và tôi muốn đặt chúng vào một DataFrame gấu trúc với các hàng được đặt tên bởi cột đầu tiên và các cột được đặt tên bởi cột thứ hai. Có vẻ như cách chăm sóc tên hàng là một cái gì đó giống như pandas.DataFrame([x[1:] for x in data], index = [x[0] for x in data])nhưng làm thế nào để tôi chăm sóc các cột để có được ma trận 2x2 (đầu ra từ tập trước là 3x4)? Có cách nào thông minh hơn để chăm sóc các nhãn hàng, thay vì bỏ qua chúng một cách rõ ràng không?

CHỈNH SỬA Có vẻ như tôi sẽ cần 2 DataFrame - một cho giá trị trung bình và một cho độ lệch chuẩn, có đúng không? Hoặc tôi có thể lưu trữ danh sách các giá trị trong mỗi "ô" không?


1
Bản sao xác định của < stackoverflow.com/questions/11415701/… >
ely

2
@EMS không hề. Tôi thấy câu hỏi đó, anh ta không cần trục quay 2D.
gt6989b

Tôi không đồng ý - Tôi nghĩ rằng bạn không quen với cách thích hợp để xếp chồng dữ liệu trong DataFrame. Nói chung, bạn muốn sử dụng thông tin trong cả cột 1 và cột 2 của mình làm chỉ mục, vì vậy bạn có thể nhanh chóng tìm kiếm dữ liệu bằng một trong hai. Những thứ trong cột 2 không thuộc về tên cột, nhưng ngay cả khi chúng có, đây là một câu hỏi hoàn toàn riêng biệt so với tiêu đề bài đăng của bạn. Tôi cho rằng việc chỉnh sửa tiêu đề có thể giúp ích (mặc dù tôi vẫn nghĩ đó không phải là một câu hỏi có ý nghĩa khác).
ely

1
@ely, gt6989b Tôi đã đặt lại điều này "... từ danh sách các bộ giá trị (hàng, cột, giá trị)" để làm rõ lý do tại sao lại là không phải là bản sao của "... từ bộ giá trị"
smci

Câu trả lời:


65

Bạn có thể xoay DataFrame của mình sau khi tạo:

>>> df = pd.DataFrame(data)
>>> df.pivot(index=0, columns=1, values=2)
# avg DataFrame
1      c1     c2
0               
r1  avg11  avg12
r2  avg21  avg22
>>> df.pivot(index=0, columns=1, values=3)
# stdev DataFrame
1        c1       c2
0                   
r1  stdev11  stdev12
r2  stdev21  stdev22

3
Hàng có chỉ mục 0và cột có tên 1không đẹp lắm ...
drevicko

49

Tôi gửi rằng tốt hơn là để dữ liệu của bạn xếp chồng lên nhau như sau:

df = pandas.DataFrame(data, columns=['R_Number', 'C_Number', 'Avg', 'Std'])

# Possibly also this if these can always be the indexes:
# df = df.set_index(['R_Number', 'C_Number'])

Sau đó, nó trực quan hơn một chút để nói

df.set_index(['R_Number', 'C_Number']).Avg.unstack(level=1)

Bằng cách này, có nghĩa là bạn đang tìm cách định hình lại các giá trị trung bình hoặc độ lệch chuẩn. Trong khi đó, chỉ sử dụng pivot, nó hoàn toàn dựa trên quy ước cột về thực thể ngữ nghĩa mà bạn đang định hình lại.


1
+1, tính rõ ràng hữu ích. Tôi rõ ràng quan tâm đến một bảng 2D - để cho phép tôi tìm kiếm các giá trị, được lập chỉ mục bởi cả danh sách hàng và cột, cũng như truy cập từng thứ nguyên một cách riêng biệt. Bạn có thể làm điều đó với dữ liệu được xếp chồng lên nhau không?
gt6989b

2
Vâng. Tốt hơn nhiều với dữ liệu xếp chồng lên nhau. Hãy nghĩ về một bảng cơ sở dữ liệu quan hệ, giống như trong SQL. Bạn không đi thổi toàn bộ một cột thành một loạt các cột lặp lại phải không? Điều đó chỉ nên xảy ra trong những trường hợp đặc biệt (tôi nghĩ đó là mô hình cao đến rộng). Thông thường, bạn coi nhiều cột là chỉ mục và thực hiện các lựa chọn bằng cách liên kết một phần một trong các cột chỉ mục hoặc liên kết tất cả chúng để có được một bản ghi cụ thể.
ely

2
Vì vậy, trong trường hợp của bạn, sau khi thiết lập chỉ mục là [R_Number, C_Number]bạn có thể làm df.ix[('r1','c2')], chẳng hạn. Hoặc bạn có thể để cả hai cột đó dưới dạng cột thông thường và sử dụng lập chỉ mục hợp lý:df[(df.R_Number == 'r1') & (df.C_Number == 'c2')]
ely

2
Nói chung, trường hợp sử dụng chính để thực hiện những gì bạn đang cố gắng thực hiện pivotlà khi bạn định dạng bảng nào đó để nó in đẹp ra màn hình hoặc được xuất độc đáo sang HTML, LaTeX hoặc .csv hoặc thứ gì đó. Giống như định dạng một bảng sẽ chuyển sang phần trình bày hoặc bài viết. Mặt khác, trong chừng mực thao tác hiệu quả dữ liệu, bạn muốn mọi thứ trở thành nhiều chỉ mục khi bạn có thể (như khóa của bảng cơ sở dữ liệu) hoặc ít nhất là các cột lặp lại để bạn có thể lập chỉ mục và kết hợp hiệu quả, v.v. Nhưng bạn không muốn thổi chúng vào cột của riêng chúng.
ely

35

Đây là những gì tôi mong đợi sẽ thấy khi tôi đặt câu hỏi này:

#!/usr/bin/env python

import pandas as pd


df = pd.DataFrame([(1, 2, 3, 4),
                   (5, 6, 7, 8),
                   (9, 0, 1, 2),
                   (3, 4, 5, 6)],
                  columns=list('abcd'),
                  index=['India', 'France', 'England', 'Germany'])
print(df)

cho

         a  b  c  d
India    1  2  3  4
France   5  6  7  8
England  9  0  1  2
Germany  3  4  5  6

Bạn đọc sai câu hỏi. Dữ liệu ban đầu được đưa ra trong câu hỏi đã có nhãn hàng và cột cho mỗi bản ghi được đề cập.
gt6989b

11
@ gt6989b Không, tôi không có. Tôi đã không cố gắng trả lời câu hỏi ban đầu, nhưng câu hỏi mà mọi người (có thể) đặt ra khi họ truy cập trang này.
Martin Thoma

8
@MartinThoma Cảm ơn, đây thực sự là những gì tôi đang tìm kiếm trên trang này.
ssword
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.