2012-12-26 41 views
5

DataFrame.ix() dường như không cắt DataFrame mà tôi muốn khi sử dụng chỉ mục phủ định.Cắt lát dữ liệu Khung dữ liệu với chỉ mục âm bằng phương thức ix()

Tôi có đối tượng DataFrame và muốn cắt 2 hàng cuối cùng.

In [90]: df = pd.DataFrame(np.random.randn(10, 4)) 

    In [91]: df 
    Out[91]: 
      0   1   2   3 
    0 1.985922 0.664665 -2.800102 1.695480 
    1 0.580509 0.782473 1.032970 1.559917 
    2 0.584387 1.798743 0.095950 0.071999 
    3 1.956221 0.075530 -0.391008 1.692585 
    4 -0.644979 -1.959265 0.749394 -0.437995 
    5 -1.204964 0.653912 -1.426602 2.409855 
    6 1.178886 2.177259 -0.165106 1.145952 
    7 1.410595 -0.761426 -1.280866 0.609122 
    8 0.110534 -0.234781 -0.819976 0.252080 
    9 1.798894 0.553394 -1.358335 1.278704 

Một cách để làm điều đó:

In [92]: df[-2:] 
    Out[92]: 
       0   1   2   3 
    8 0.110534 -0.234781 -0.819976 0.252080 
    9 1.798894 0.553394 -1.358335 1.278704 

Anther cách để làm điều đó:

In [93]: df.ix[len(df)-2:, :] 
    Out[93]: 
       0   1   2   3 
    8 0.110534 -0.234781 -0.819976 0.252080 
    9 1.798894 0.553394 -1.358335 1.278704 

Bây giờ tôi muốn sử dụng chỉ mục tiêu cực, nhưng có vấn đề:

In [94]: df.ix[-2:, :] 
    Out[94]: 
       0   1   2   3 
    0 1.985922 0.664665 -2.800102 1.695480 
    1 0.580509 0.782473 1.032970 1.559917 
    2 0.584387 1.798743 0.095950 0.071999 
    3 1.956221 0.075530 -0.391008 1.692585 
    4 -0.644979 -1.959265 0.749394 -0.437995 
    5 -1.204964 0.653912 -1.426602 2.409855 
    6 1.178886 2.177259 -0.165106 1.145952 
    7 1.410595 -0.761426 -1.280866 0.609122 
    8 0.110534 -0.234781 -0.819976 0.252080 
    9 1.798894 0.553394 -1.358335 1.278704 

Làm cách nào để sử dụng lập chỉ mục phủ định với DataFrame.i x() chính xác? Cảm ơn.

Trả lời

3

ix mục đích chính của việc này là cho phép lập chỉ mục giống như sần với sự hỗ trợ cho nhãn hàng và cột. Vì vậy, tôi không chắc chắn trường hợp sử dụng của bạn là mục đích dự định. Dưới đây là một vài cách tôi có thể nghĩ đến, chủ yếu là tầm thường:

In [142]: df.ix[:][-2:] 
Out[142]: 
      0   1   2   3 
8 0.386882 -0.836112 -0.108250 -0.433797 
9 0.642468 -0.399255 -0.911456 -0.497720 

In [161]: df.ix[df.index[-2:],:] 
Out[161]: 
      0   1   2   3 
8 0.386882 -0.836112 -0.108250 -0.433797 
9 0.642468 -0.399255 -0.911456 -0.497720 

Tôi không nghĩ rằng ix hỗ trợ lập chỉ mục phủ định. Dường như với chỉ cần bỏ qua nó hoàn toàn:

In [181]: df.ix[-100:,:] 
Out[181]: 
      0   1   2   3 
0 -1.144137 -1.042034 -2.158838 0.674055 
1 -0.424184 1.237318 -1.846130 0.575357 
2 -0.844974 -0.541060 2.197364 -0.031898 
3 0.846263 1.244450 -1.570566 -0.477919 
4 -0.193445 0.171045 -0.235587 -1.185583 
5 1.361539 -1.107389 -1.321081 -0.776407 
6 0.505907 -1.364414 -2.093770 0.144016 
7 -0.888465 -0.329153 0.491264 -0.363472 
8 0.386882 -0.836112 -0.108250 -0.433797 
9 0.642468 -0.399255 -0.911456 -0.497720 

Edit: Từ pandas documentation ta có:

Label dựa trên lập chỉ mục với số nguyên trục nhãn là một đề tài gai góc. Nó đã được thảo luận rất nhiều về danh sách gửi thư và giữa các thành viên khác nhau của cộng đồng Python khoa học. Trong gấu trúc, quan điểm chung của chúng tôi là các nhãn quan trọng hơn vị trí số nguyên. Do đó, chỉ có thể lập chỉ mục các chỉ số trục chỉ số nguyên bằng các công cụ chuẩn như .ix. Đoạn mã dưới đây sẽ tạo ra ngoại lệ:

s = Series(range(5)) 
s[-1] 
df = DataFrame(np.random.randn(5, 4)) 
df 
df.ix[-2:] 

quyết định thận trọng này đã được thực hiện để ngăn chặn sự mơ hồ và tinh tế lỗi (nhiều người sử dụng báo cáo việc tìm kiếm lỗi khi thay đổi API đã được thực hiện để dừng “rơi trở lại” trên chỉ mục vị trí dựa trên).

4

Đây là một lỗi:

In [1]: df = pd.DataFrame(np.random.randn(10, 4)) 

In [2]: df 
Out[2]: 
      0   1   2   3 
0 -3.100926 -0.580586 -1.216032 0.425951 
1 -0.264271 -1.091915 -0.602675 0.099971 
2 -0.846290 1.363663 -0.382874 0.065783 
3 -0.099879 -0.679027 -0.708940 0.138728 
4 -0.302597 0.753350 -0.112674 -1.253316 
5 -0.213237 -0.467802 0.037350 0.369167 
6 0.754915 -0.569134 -0.297824 -0.600527 
7 0.644742 0.038862 0.216869 0.294149 
8 0.101684 0.784329 0.218221 0.965897 
9 -1.482837 -1.325625 1.008795 -0.150439 

In [3]: df.ix[-2:] 
Out[3]: 
      0   1   2   3 
0 -3.100926 -0.580586 -1.216032 0.425951 
1 -0.264271 -1.091915 -0.602675 0.099971 
2 -0.846290 1.363663 -0.382874 0.065783 
3 -0.099879 -0.679027 -0.708940 0.138728 
4 -0.302597 0.753350 -0.112674 -1.253316 
5 -0.213237 -0.467802 0.037350 0.369167 
6 0.754915 -0.569134 -0.297824 -0.600527 
7 0.644742 0.038862 0.216869 0.294149 
8 0.101684 0.784329 0.218221 0.965897 
9 -1.482837 -1.325625 1.008795 -0.150439 

https://github.com/pydata/pandas/issues/2600

Lưu ý rằng df[-2:] sẽ làm việc:

In [4]: df[-2:] 
Out[4]: 
      0   1   2   3 
8 0.101684 0.784329 0.218221 0.965897 
9 -1.482837 -1.325625 1.008795 -0.150439 
+0

Thanks for the help. –

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