2012-11-04 36 views
5

Tôi có một số dữ liệu radar có định dạng lẻ, và tôi không thể tìm ra cách xoay vòng chính xác nó bằng thư viện gấu trúc.pandas DataFrame pivoting issue

dữ liệu của tôi:

speed time 
loc  
A 63 0000 
B 61 0000 
C 63 0000 
D 65 0000 
A 73 0005 
B 71 0005 
C 73 0005 
D 75 0005 

Tôi muốn biến chúng thành một DataFrame trông như thế này:

0000 0005 
loc  
A 63  73 
B 61  71 
C 63  73 
D 65  75 

tôi đã thực hiện rất nhiều quan trọng xung quanh nhưng dường như không thể để có được cú pháp chính xác. Có ai giúp đuợc không?

Cảm ơn!

Trả lời

5

Bạn có thể sử dụng phương pháp pivot ở đây:

In [71]: df 
Out[71]: 
    speed time 
loc    
A  63  0 
B  61  0 
C  63  0 
D  65  0 
A  73  5 
B  71  5 
C  73  5 
D  75  5 

In [72]: df.reset_index().pivot('loc', 'time', 'speed') 
Out[72]: 
time 0 5 
loc   
A  63 73 
B  61 71 
C  63 73 
D  65 75 
+0

ah ... lừa tốt. Cảm ơn! –

+0

Tôi nhận được kết quả của "ReshapeError: Chỉ mục chứa các mục trùng lặp, không thể định lại hình ảnh". Một số vị trí của tôi là các chuỗi có dấu cách trong đó, có thể liên quan đến không? –

+0

Ye. Không làm việc cho tôi. Tôi nhận được 'ReshapeError: Chỉ mục chứa các mục trùng lặp, không thể định lại hình ảnh'. –

3

Giả sử nguồn dữ liệu của bạn trong một tập tin csv,

from pandas.io.parsers import read_csv 
df = read_csv("radar_data.csv") 

df # shows what is in df 

     loc speed time 
0 A  63  0 
1 B  61  0 
2 C  63  0 
3 D  65  0 
4 A  73  5 
5 B  73  5 
6 C  75  5 
7 D  75  5 
8 A  67  0 
9 B  68  0 
10 C  68  0 
11 D  70  0 

Lưu ý rằng tôi đã không được thiết lập loc như chỉ số chưa nên nó sử dụng một chỉ số autoincrement số nguyên.

panel = df.set_index(['loc', 'time']).sortlevel(0).to_panel() 

Tuy nhiên, nếu khung dữ liệu của bạn đã được sử dụng loc như chỉ số, chúng tôi sẽ cần phải thêm cột time vào nó để chúng ta có một loc thời gian chỉ số thứ bậc. Bạn có thể thực hiện việc này bằng cách sử dụng tùy chọn append mới trong phương thức set_index. Như thế này: -

panel = df.set_index(['time'], append=True).sortlevel(0).to_panel() 

Trong cả hai trường hợp, chúng ta nên đến kịch bản này: -

panel # shows what panel is 

<class 'pandas.core.panel.Panel'> 
Dimensions: 1 (items) x 4 (major) x 2 (minor) 
Items: speed to speed 
Major axis: A to D 
Minor axis: 0 to 5 

panel["speed"] # <--- This is what you are looking for. 


time 0 5 
loc   
A  63 67 
B  73 61 
C  68 73 
D  63 68 

Hope this helps.

+0

Đó là rất tốt, cảm ơn! Lỗi của tôi là không sử dụng lệnh sortlevel(). To_panel(). Đọc phần đó của tài liệu gấu trúc ngay bây giờ ... Cảm ơn một lần nữa! –

+0

Chào mừng bạn. Rất vui được! Lưu ý rằng đối với khung dữ liệu của bạn, bạn không có chỉ mục autoincrement. Vì vậy, tôi đã chỉnh sửa câu trả lời của mình để đề xuất bạn sử dụng tùy chọn 'append = True' trong khi thêm 'thời gian' vào chỉ mục 'loc' hiện có của bạn. –

+1

Nếu tôi muốn có được một đối tượng Series của tất cả các tốc độ cho một vị trí nhất định, cú pháp trông như thế nào? IE, làm thế nào tôi có thể lấy một hàng từ bảng điều khiển? –

Các vấn đề liên quan