2013-02-25 44 views
16

tôi biết về những phương pháp cột lát:giữ/lát cột cụ thể trong gấu trúc

df2 = df[["col1", "col2", "col3"]]df2 = df.ix[:,0:2]

nhưng tôi tự hỏi nếu có một cách để cắt các cột từ phía trước/giữa/cuối một khung dữ liệu trong cùng một slice mà không liệt kê cụ thể từng phần. Ví dụ, một khung dữ liệu df với các cột: col1, col2, col3, col4, col5 và col6.

Có cách nào để làm điều gì đó như thế này không?

df2 = df.ix[:, [0:2, "col5"]]

tôi trong tình hình nơi tôi có hàng trăm cột và thường xuyên cần phải cắt những cái cụ thể cho các yêu cầu khác nhau. Tôi đã kiểm tra qua tài liệu và chưa thấy một cái gì đó như thế này. Tôi đã bỏ qua một cái gì đó?

Cảm ơn!

* Đã chỉnh sửa rõ ràng hơn về những gì tôi đang tìm kiếm.

Trả lời

14

IIUC, cách đơn giản nhất tôi có thể nghĩ đến sẽ là một cái gì đó như thế này:

>>> import pandas as pd 
>>> import numpy as np 
>>> df = pd.DataFrame(np.random.randn(5, 10)) 
>>> df[list(df.columns[:2]) + [7]] 
      0   1   7 
0 0.210139 0.533249 1.780426 
1 0.382136 0.083999 -0.392809 
2 -0.237868 0.493646 -1.208330 
3 1.242077 -0.781558 2.369851 
4 1.910740 -0.643370 0.982876 

nơi gọi list là không bắt buộc vì nếu không thì đối tượng Index sẽ cố gắng vector thêm chính nó vào 7.

Nó sẽ có thể đặc biệt hợp cụ thể cái gì đó như NumPy của r_ để

df[col_[:2, "col5", 3:6]] 

sẽ làm việc, mặc dù tôi không biết nếu nó sẽ có giá trị các rắc rối.

-1

Không chắc chắn chính xác những gì bạn đang yêu cầu. Nếu bạn muốn 5 dòng đầu tiên và cuối cùng của một cột cụ thể, bạn có thể làm một cái gì đó như thế này

df = pd.DataFrame({'col1': np.random.randint(0,3,1000), 
       'col2': np.random.rand(1000), 
       'col5': np.random.rand(1000)}) 
In [36]: df['col5'] 
Out[36]: 
0  0.566218 
1  0.305987 
2  0.852257 
3  0.932764 
4  0.185677 
... 
996 0.268700 
997 0.036250 
998 0.470009 
999 0.361089 
Name: col5, Length: 1000 
In [38]: df['col5'][(df.index < 5) | (df.index > (len(df) - 5))] 
Out[38]: 
0  0.566218 
1  0.305987 
2  0.852257 
3  0.932764 
4  0.185677 
996 0.268700 
997 0.036250 
998 0.470009 
999 0.361089 
Name: col5 

Hoặc, tổng quát hơn, bạn có thể viết một hàm

In [41]: def head_and_tail(df, n=5): 
    ...:  return df[(df.index < n) | (df.index > (len(df) - n))] 
In [44]: head_and_tail(df, 7) 
Out[44]: 
    col1  col2  col5 
0  0 0.489944 0.566218 
1  1 0.639213 0.305987 
2  1 0.000690 0.852257 
3  2 0.620568 0.932764 
4  0 0.310816 0.185677 
5  0 0.930496 0.678504 
6  2 0.165250 0.440811 
994  2 0.842181 0.636472 
995  0 0.899453 0.830839 
996  0 0.418264 0.268700 
997  0 0.228304 0.036250 
998  2 0.031277 0.470009 
999  1 0.542502 0.361089 
+0

Điều tôi đang tìm là cách "giữ" các cột cụ thể trong một khung dữ liệu và loại trừ phần còn lại. Phương pháp bạn đề xuất là tốt cho việc chọn đầu tiên và cuối cùng ** hàng của một dataframe cho bất kỳ cột nào, tuy nhiên những gì tôi sau là một cách để giữ/thả cột bằng cách sử dụng kết hợp phạm vi/danh sách các cột trong một lát. – bdiamante

+0

Vì vậy, thay vì những gì tôi đưa vào (đầu tiên 5 và 5 hàng cuối cùng), bạn muốn có cách để * loại trừ * những hàng đó? Bạn có thể đưa ra một ví dụ cụ thể với một khung dữ liệu nhỏ hiển thị các tập con mà bạn quan tâm không? – beardc

4

Nếu tên cột của bạn có thông tin mà bạn có thể lọc, bạn có thể sử dụng df.filter (regex = 'name *'). Tôi đang sử dụng tính năng này để lọc giữa 189 kênh dữ liệu của mình từ a1_01 đến b3_21 và hoạt động tốt.

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