Chọn một hàng chuỗi gấu trúc / khung dữ liệu theo chỉ số nguyên


395

Tôi tò mò về lý do tại sao df[2]không được hỗ trợ, trong khi df.ix[2]df[2:3]cả hai đều hoạt động.

In [26]: df.ix[2]
Out[26]: 
A    1.027680
B    1.514210
C   -1.466963
D   -0.162339
Name: 2000-01-03 00:00:00

In [27]: df[2:3]
Out[27]: 
                  A        B         C         D
2000-01-03  1.02768  1.51421 -1.466963 -0.162339

Tôi hy vọng df[2]sẽ làm việc theo cách tương tự như df[2:3]để phù hợp với quy ước lập chỉ mục Python. Có một lý do thiết kế cho việc không hỗ trợ hàng lập chỉ mục theo số nguyên duy nhất?


4
df.ix[2]không hoạt động - ít nhất là không ởpandas version '0.19.2'
Zahra

9
Để xem sự khác biệt giữa lựa chọn hàng và cột thông qua toán tử lập chỉ mục [], hãy xem câu trả lời dưới đây . Cũng KHÔNG BAO GIỜ SỬ DỤNG .ix, nó không được dùng nữa
Ted Petrou

Câu trả lời:


552

lặp lại @HYRY, xem các tài liệu mới trong 0.11

http://pandas.pydata.org/pandas-docs/urdy/indexing.html

Ở đây chúng tôi có các toán tử mới, .ilocđể chỉ hỗ trợ khám phá lập chỉ mục số nguyên và .locchỉ hỗ trợ khai thác chỉ mục nhãn

ví dụ tưởng tượng kịch bản này

In [1]: df = pd.DataFrame(np.random.rand(5,2),index=range(0,10,2),columns=list('AB'))

In [2]: df
Out[2]: 
          A         B
0  1.068932 -0.794307
2 -0.470056  1.192211
4 -0.284561  0.756029
6  1.037563 -0.267820
8 -0.538478 -0.800654

In [5]: df.iloc[[2]]
Out[5]: 
          A         B
4 -0.284561  0.756029

In [6]: df.loc[[2]]
Out[6]: 
          A         B
2 -0.470056  1.192211

[] chỉ cắt các hàng (theo vị trí nhãn)


7
Nếu bạn muốn hàng thứ 2 và thứ 3 và thứ 4 thì sao?
FaCoffee

1
bạn chỉ có thể vượt qua một danh sách các chỉ mục; tài liệu được chỉ ra ở trên
Jeff

2
Có ai có một lời biện minh cho những tên này? Tôi thấy những điều này khó nhớ vì tôi không chắc tại sao lại iloclà hàng và loclà nhãn.
kilojoules

3
@kilojoules .iloctìm kiếm mọi thứ theo thứ tự của chúng trong chỉ mục (ví dụ .iloc[[2]]) là "hàng" thứ hai trong df. Hàng đó xảy ra ở vị trí chỉ mục4 . .loctìm kiếm chúng theo giá trị chỉ số của chúng. Vậy có lẽ "iloc" giống như "i" như trong A[i]? :)
Jim K.

1
@Jeff - điều này hoạt động rất tốt, nhưng điều gì xảy ra khi bạn muốn sao chép một hàng từ khung dữ liệu của mình, chẳng hạn như df.loc[-1] = df.iloc[[0]]và chèn nó? Khung đi kèm với một cột chỉ mục được thêm vào ValueError: cannot set a row with mismatched columns (xem stackoverflow.com/questions/47340571/iêu )
Growler

63

Mục đích chính của toán tử lập chỉ mục DataFrame []là chọn các cột.

Khi toán tử lập chỉ mục được truyền qua một chuỗi hoặc số nguyên, nó sẽ cố gắng tìm một cột có tên cụ thể đó và trả về dưới dạng Sê-ri.

Vì vậy, trong câu hỏi trên: df[2]tìm kiếm một tên cột khớp với giá trị số nguyên 2. Cột này không tồn tại và a KeyErrorđược nâng lên.


Toán tử lập chỉ mục DataFrame thay đổi hoàn toàn hành vi để chọn các hàng khi ký hiệu lát được sử dụng

Thật kỳ lạ, khi được đưa ra một lát, toán tử lập chỉ mục DataFrame chọn các hàng và có thể làm như vậy theo vị trí số nguyên hoặc theo nhãn chỉ mục.

df[2:3]

Điều này sẽ cắt bắt đầu từ hàng có vị trí số nguyên 2 lên đến 3, không bao gồm phần tử cuối cùng. Vì vậy, chỉ là một hàng duy nhất. Sau đây chọn các hàng bắt đầu tại vị trí số nguyên 6 lên đến nhưng không bao gồm 20 bởi mỗi hàng thứ ba.

df[6:20:3]

Bạn cũng có thể sử dụng các lát bao gồm các nhãn chuỗi nếu chỉ mục DataFrame của bạn có các chuỗi trong đó. Để biết thêm chi tiết, xem giải pháp này trên .iloc vs .loc .

Tôi gần như không bao giờ sử dụng ký hiệu lát này với toán tử lập chỉ mục vì nó không rõ ràng và hầu như không bao giờ được sử dụng. Khi cắt theo hàng, dính với .loc/.iloc.


Cố gắng thêm hàng vào một khung dữ liệu khác bằng toán tử indxasing nhưng khung dữ liệu khác vẫn trống. Tại sao?
FindOutIslamNow

23

Bạn có thể nghĩ DataFrame là một bản chính của Sê-ri. df[key]cố gắng chọn chỉ mục cột theo keyvà trả về một đối tượng Sê-ri.

Tuy nhiên, việc cắt bên trong [] cắt các hàng, vì đó là thao tác rất phổ biến.

Bạn có thể đọc tài liệu để biết chi tiết:

http://pandas.pydata.org/pandas-docs/urdy/indexing.html#basics


Cảm ơn bạn đã gợi ý. Thật buồn cười, loại điều này là những gì vẫn làm cho gấu trúc câu hỏi đôi khi. Thêm ngoại lệ cho hành vi trong một số tình huống nhất định, .. với tôi cảm giác như hy sinh tính nhất quán để có một chút thuận tiện.
Carl Berger

15

Để truy cập dựa trên chỉ mục vào bảng gấu trúc, người ta cũng có thể xem xét tùy chọn numpy.as_array để chuyển đổi bảng thành mảng Numpy như

np_df = df.as_matrix()

và sau đó

np_df[i] 

sẽ làm việc


11
đánh bại toàn bộ mục đích của các chỉ mục dataframes và mọi thứ khác mà gấu trúc đưa ra
Fábio Dias

6

Bạn có thể xem mã nguồn .

DataFramecó một hàm riêng _slice()để cắt lát DataFramevà nó cho phép tham số axisxác định trục nào sẽ cắt. Các __getitem__()cho DataFramekhông thiết lập các trục trong khi gọi _slice(). Vì vậy, _slice()cắt nó theo trục mặc định 0.

Bạn có thể thực hiện một thử nghiệm đơn giản, có thể giúp bạn:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)

5

bạn có thể lặp qua khung dữ liệu như thế này.

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.