2014-05-07 27 views
15

mã hiện tại của tôi được hiển thị dưới đây - Tôi đang nhập khẩu một file MAT và cố gắng để tạo ra một DataFrame từ biến bên trong nó:Pandas: Tạo DataFrame từ Dòng

mat = loadmat(file_path) # load mat-file 
Variables = mat.keys() # identify variable names 

df = pd.DataFrame   # Initialise DataFrame 

for name in Variables: 

    B = mat[name] 
    s = pd.Series (B[:,1]) 

Vì vậy, trong vòng tôi có thể tạo ra một loạt của mỗi biến (chúng là mảng có hai cột - vì vậy giá trị tôi cần nằm trong cột 2)

Câu hỏi của tôi là làm cách nào để nối chuỗi vào khung dữ liệu? Tôi đã xem qua tài liệu và không có ví dụ nào phù hợp với những gì tôi đang cố gắng làm.

Best Regards,

Bến

Trả lời

8

Không cần phải khởi tạo một DataFrame rỗng (bạn đã thậm chí không làm điều đó, bạn cần pd.DataFrame() với dấu ngoặc). Thay vì tạo ra một danh sách các Series và concat những cùng với df = pd.concat(series, axis=1)

Cái gì như:

series = [pd.Series(mat[name][:, 1]) for name in Variables] 
df = pd.concat(series, axis=1) 
+0

Tom, hoạt động tuyệt vời - chỉ vấn đề là các cột trong khung dữ liệu kết quả được đặt tên theo số. Làm thế nào tôi sẽ đi về việc sử dụng "tên" như tên cột trong dataframe kết quả? – BMichell

+3

Xin lỗi, trả lời câu hỏi của riêng tôi ... df.columns = Biến – BMichell

2

Tôi đoán bao phấn cách, có thể nhanh hơn, để đạt được điều này là 1) Sử dụng dict hiểu để có được dict mong muốn (ví dụ: , lấy col thứ 2 của mỗi mảng) 2) Sau đó sử dụng pd.DataFrame để tạo một thể hiện trực tiếp từ dict mà không lặp trên mỗi col và concat.

Giả sử mat vẻ của bạn như thế này (bạn có thể bỏ qua điều này kể từ mat của bạn được tải từ tập tin):

In [135]: mat = {'a': np.random.randint(5, size=(4,2)), 
    .....: 'b': np.random.randint(5, size=(4,2))} 

In [136]: mat 
Out[136]: 
{'a': array([[2, 0], 
     [3, 4], 
     [0, 1], 
     [4, 2]]), 'b': array([[1, 0], 
     [1, 1], 
     [1, 0], 
     [2, 1]])} 

Sau đó, bạn có thể làm:

In [137]: df = pd.DataFrame ({name:mat[name][:,1] for name in mat}) 

In [138]: df 
Out[138]: 
    a b 
0 0 0 
1 4 1 
2 1 0 
3 2 1 

[4 rows x 2 columns] 
+0

Đó là một giải pháp tốt đẹp cảm ơn! Có thể thêm một câu lệnh if trong dict (hoặc list) comprehension để bỏ qua các mảng có kích thước khác không? Các dict tôi kết thúc với từ fiel MAT của tôi có một vài trăm 2x4000 mảng và một số ít các mảng ngẫu nhiên của các kích cỡ khác nhau. – BMichell

+0

Bạn có thể thêm câu lệnh if after ... '{name: mat [name] [:, 1] cho tên trong mat nếu ...} ' – Happy001

+0

Thu sử dụng đọc hiểu dict có nhược điểm là các khóa trong dicts python chuẩn không có thứ tự, do đó thứ tự các cột không được bảo toàn. – Jaan

14

Dưới đây là làm thế nào để tạo ra một DataFrame trong đó mỗi chuỗi là một hàng.

Đối với một dòng đơn (kết quả trong một DataFrame đơn hàng):

series = pd.Series([1,2], index=['a','b']) 
df = pd.DataFrame([series]) 

Đối với nhiều series với chỉ số giống hệt nhau:

cols = ['a','b'] 
list_of_series = [pd.Series([1,2],index=cols), pd.Series([3,4],index=cols)] 
df = pd.DataFrame(list_of_series, columns=cols) 

Đối với nhiều series với các chỉ số có thể khác nhau:

list_of_series = [pd.Series([1,2],index=['a','b']), pd.Series([3,4],index=['a','c'])] 
df = pd.concat(list_of_series, axis=1).transpose() 

Để tạo một DataFrame trong đó mỗi chuỗi là một lumn, xem câu trả lời của người khác. Ngoài ra, người ta có thể tạo một DataFrame nơi mỗi loạt là một hàng, như trên, và sau đó sử dụng df.transpose(). Tuy nhiên, cách tiếp cận thứ hai là không hiệu quả nếu các cột có các kiểu dữ liệu khác nhau.