2015-02-26 19 views
10

Nói df là một khung dữ liệu gấu trúc.Lập chỉ mục các khung dữ liệu Pandas: các hàng số nguyên, các cột được đặt tên

  • df.loc[] chỉ chấp nhận tên
  • df.iloc[] chỉ chấp nhận số nguyên (vị trí thực tế)
  • df.ix[] chấp nhận cả tên và số nguyên:

Khi tham khảo hàng, df.ix[row_idx, ] chỉ muốn được đặt tên. ví dụ.

df = pd.DataFrame({'a' : ['one', 'two', 'three','four', 'five', 'six'], 
        '1' : np.arange(6)}) 
df = df.ix[2:6] 
print(df) 

    1  a 
2 2 three 
3 3 four 
4 4 five 
5 5 six 

df.ix[0, 'a'] 

ném lỗi, nó không trả lại 'hai'.

Khi tham chiếu cột, iloc ưu tiên số nguyên chứ không phải tên. ví dụ.

df.ix[2, 1] 

lợi nhuận 'ba', chứ không phải 2. (Mặc dù df.idx[2, '1'] không trở 2).

Thật kỳ lạ, tôi muốn có chức năng đối diện chính xác. Thông thường tên cột của tôi rất có ý nghĩa, vì vậy trong mã của tôi, tôi trực tiếp tham khảo chúng. Nhưng do có rất nhiều công cụ quan sát, tên hàng trong khung dữ liệu gấu trúc của tôi thường không tương ứng với range(len(df)).

Tôi nhận ra tôi có thể sử dụng:

df.iloc[0].loc['a'] # returns three 

Nhưng có vẻ xấu xí! Có ai biết một cách tốt hơn để làm điều này, để mã sẽ trông như thế này?

df.foo[0, 'a'] # returns three 

Thực tế, có thể thêm phương pháp mới của riêng tôi vào pandas.core.frame.DataFrame s, vì vậy ví dụ: df.idx(rows, cols) thực ra là df.iloc[rows].loc[cols]?

+1

Bạn có thể sử dụng 'df ['a']. Iloc [0]'. – unutbu

+6

Xem thêm [GH 9213] (https://github.com/pydata/pandas/issues/9213#issuecomment-72076683), gợi ý 'df.loc [df.index [0], 'a']'. Điều này có [lợi thế của việc không sử dụng lập chỉ mục chuỗi] (http://pandas.pydata.org/pandas-docs/stable/indexing.html#why-does-the-assignment-when-using-chained-indexing-fail) , có nghĩa là nó sẽ hoạt động khi thực hiện nhiệm vụ, trong khi 'df [['a', 'b']]. iloc [0] = val' sẽ không. – unutbu

+0

không thực sự giải quyết vấn đề của bạn nhưng câu trả lời rất tốt ở đây: https://stackoverflow.com/questions/31593201/pandas-iloc-vs-ix-vs-loc-explanation – JohnE

Trả lời

8

Đó là câu trả lời trễ, nhưng nhận xét của @ unutbu vẫn hợp lệ và là giải pháp tuyệt vời cho vấn đề này.

Để index một DataFrame với hàng nguyên và đặt tên cột (cột dán nhãn):

df.loc[df.index[#], 'NAME'] nơi # là một chỉ số nguyên có giá trị và NAME là tên của cột.

+0

Dường như rất chậm trên các khung dữ liệu dài. – ConanG

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