2014-04-21 18 views
16

Với DataFrame sau, làm cách nào tôi có thể thay đổi cột "beyer" dựa trên chỉ mục mà không có Pandas gán giá trị đã chuyển sang giá trị chỉ mục khác?Làm thế nào để bạn di chuyển Pandas DataFrame bằng multiindex?

    line_date line_race beyer 
horse           
Last Gunfighter 2013-09-28   10  99 
Last Gunfighter 2013-08-18   10 102 
Last Gunfighter 2013-07-06   8 103 
..... 
Paynter   2013-09-28   10 103 
Paynter   2013-08-31   10  88 
Paynter   2013-07-27   8 100 

df['beyer'].shift(1) sản xuất ...

    line_date line_race beyer beyer_shifted 
horse              
Last Gunfighter 2013-09-28   10  99   NaN 
Last Gunfighter 2013-08-18   10 102    99 
Last Gunfighter 2013-07-06   8 103   102 
..... 
Paynter   2013-09-28   10 103    71 
Paynter   2013-08-31   10  88   103 
Paynter   2013-07-27   8 100    88 

Vấn đề là Paynter được tạo một Beyer rằng cuối Gunfighter (kỷ lục đầu tiên của mình) được giao nhiệm vụ. Thay vào đó tôi muốn nó đi như thế này ...

    line_date line_race beyer beyer_shifted 
horse              
Last Gunfighter 2013-09-28   10  99   NaN 
Last Gunfighter 2013-08-18   10 102    99 
Last Gunfighter 2013-07-06   8 103   102 
..... 
Paynter   2013-09-28   10 103   NaN 
Paynter   2013-08-31   10  88   103 
Paynter   2013-07-27   8 100    88 

Trả lời

25

Sử dụng groupby/shift để áp dụng các thay đổi cho từng nhóm riêng lẻ: (. Nhờ Jeff để chỉ ra đơn giản hóa này)

In [60]: df['beyer_shifted'] = df.groupby(level=0)['beyer'].shift(1); df 
Out[61]: 
        line_date line_race beyer beyer_shifted 
Last Gunfighter 2013-09-28   10  99   NaN 
Last Gunfighter 2013-08-18   10 102    99 
Last Gunfighter 2013-07-06   8 103   102 
Paynter   2013-09-28   10 103   NaN 
Paynter   2013-08-31   10  88   103 
Paynter   2013-07-27   8 100    88 

Nếu bạn có một multiindex, bạn có thể nhóm theo nhiều cấp bằng cách chuyển một chuỗi gồm ints hoặc tên cấp đến tham số groupby'slevel.

+0

Điều này hoạt động hoàn hảo. Cảm ơn bạn! – TravisVOX

+0

Tôi nghĩ chúng ta nên thêm điều này vào sách dạy nấu ăn. bạn có thể làm PR khi bạn có cơ hội không? – Jeff

+0

Tại sao nó sẽ ném lên này ... ValueError: không thể reindex từ một trục trùng lặp – TravisVOX

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