2013-02-28 41 views
13

Có một khung dữ liệu lớn mà tôi muốn lấy lát (theo nhiều tiêu chí boolean) và sau đó sửa đổi các mục nhập trong các lát đó để thay đổi khung dữ liệu gốc - nghĩa là tôi cần view đối với bản gốc. Vấn đề là, lập chỉ mục ưa thích luôn trả về một copy. Tư tưởng phương pháp .ix, nhưng lập chỉ mục boolean với phương thức df.ix[] cũng trả về một bản sao.lập chỉ mục boolean có thể tạo khung nhìn cho một khung dữ liệu gấu trúc lớn?

Về cơ bản nếu df là khung dữ liệu của tôi, tôi muốn xem cột C sao cho C!=0, A==10, B<30,... v.v ... Có cách nào nhanh chóng để làm điều này trong gấu trúc không?

Trả lời

8

Mặc dù df.loc[idx] có thể là bản sao của một phần của df, assignment to df.loc[idx] sửa đổi df chính nó. (Điều này cũng đúng đối với df.ilocdf.ix.)

Ví dụ,

import pandas as pd 
import numpy as np 
df = pd.DataFrame({'A':[9,10]*6, 
        'B':range(23,35), 
        'C':range(-6,6)}) 

print(df) 
#  A B C 
# 0 9 23 -6 
# 1 10 24 -5 
# 2 9 25 -4 
# 3 10 26 -3 
# 4 9 27 -2 
# 5 10 28 -1 
# 6 9 29 0 
# 7 10 30 1 
# 8 9 31 2 
# 9 10 32 3 
# 10 9 33 4 
# 11 10 34 5 

Đây là chỉ số boolean của chúng tôi:

idx = (df['C']!=0) & (df['A']==10) & (df['B']<30) 

Chúng tôi có thể sửa đổi những dãy df nơi idx là True bởi giao cho df.loc[idx, ...]. Ví dụ,

df.loc[idx, 'A'] += df.loc[idx, 'B'] * df.loc[idx, 'C'] 
print(df) 

mang

 A B C 
0  9 23 -6 
1 -110 24 -5 
2  9 25 -4 
3 -68 26 -3 
4  9 27 -2 
5 -18 28 -1 
6  9 29 0 
7 10 30 1 
8  9 31 2 
9 10 32 3 
10 9 33 4 
11 10 34 5 
+0

Một giải pháp tuyệt vời cho hầu hết các trường hợp sử dụng. :) –

+0

Cảm ơn ... chỉ là những gì tôi đang tìm kiếm! – optional

+0

Khi tôi chạy lệnh 'subdf ['A'] + = subdf ['B'] * subdf ['C']', nó thay đổi giá trị nhưng tôi nhận được cảnh báo sau: 'Giá trị đang cố gắng được đặt trên một bản sao của một slice từ một DataFrame. Thử sử dụng .loc [row_indexer, col_indexer] = value thay vì Xem các lưu ý trong tài liệu: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy # Được sử dụng trong nội bộ để gỡ lỗi hộp cát bên dưới trình thông dịch bên ngoài'. Sau đó, tôi đã thử làm theo đề xuất trong cảnh báo này 'subdf.loc [:, 'A'] + = subdf ['B'] * subdf ['C']' và nhận lại cùng một cảnh báo. Cái gì đúng? –

4

Các tài liệu gấu trúc có một phần trên Returning a view versus a copy:

Các quy tắc về việc khi nào một cái nhìn về những dữ liệu được trả về là hoàn toàn phụ thuộc vào NumPy. Bất cứ khi nào một mảng các nhãn hoặc một vector boolean có liên quan đến hoạt động lập chỉ mục, kết quả sẽ là một bản sao. Với việc lập chỉ mục nhãn/thu nhỏ đơn lẻ và cắt, ví dụ: df.ix[3:6] hoặc df.ix[:, 'A'], chế độ xem sẽ được trả lại.

0

Building tắt của dụ unutbu của bạn cũng có thể sử dụng chỉ số boolean trên df.index như vậy:

In [11]: df.ix[df.index[idx]] = 999 

In [12]: df 
Out[12]: 
     A B C 
0  9 23 -6 
1 999 999 999 
2  9 25 -4 
3 999 999 999 
4  9 27 -2 
5 999 999 999 
6  9 29 0 
7 10 30 1 
8  9 31 2 
9 10 32 3 
10 9 33 4 
11 10 34 5 
Các vấn đề liên quan