2016-06-19 28 views
6

Giả sử tôi có khung dữ liệu sau và tôi muốn thay đổi hai thành phần trong cột c tương ứng với hai phần tử đầu tiên trong cột a bằng 1 bằng 2.Sử dụng loc và iloc với nhau trong gấu trúc

>>> df = pd.DataFrame({"a" : [1,1,1,1,2,2,2,2], "b" : [2,3,1,4,5,6,7,2], "c" : [1,2,3,4,5,6,7,8]}) 
>>> df.loc[df["a"] == 1, "c"].iloc[0:2] = 2 
>>> df 
    a b c 
0 1 2 1 
1 1 3 2 
2 1 1 3 
3 1 4 4 
4 2 5 5 
5 2 6 6 
6 2 7 7 
7 2 2 8 

Mã trong dòng thứ hai không hoạt động vì iloc đặt bản sao, do đó khung dữ liệu gốc không bị sửa đổi. Làm thế nào tôi sẽ làm điều này?

Trả lời

2

Bạn có thể sử dụng Index.isin:

import pandas as pd 

df = pd.DataFrame({"a" : [1,1,1,1,2,2,2,2], 
        "b" : [2,3,1,4,5,6,7,2], 
        "c" : [1,2,3,4,5,6,7,8]}) 

#more general index      
df.index = df.index + 10 
print (df) 
    a b c 
10 1 2 1 
11 1 3 2 
12 1 1 3 
13 1 4 4 
14 2 5 5 
15 2 6 6 
16 2 7 7 
17 2 2 8 

print (df.index.isin(df.index[:2])) 
[ True True False False False False False False] 

df.loc[(df["a"] == 1) & (df.index.isin(df.index[:2])), "c"] = 2 
print (df) 
    a b c 
10 1 2 2 
11 1 3 2 
12 1 1 3 
13 1 4 4 
14 2 5 5 
15 2 6 6 
16 2 7 7 
17 2 2 8 

Nếu chỉ số này nice (bắt đầu từ 0 mà không cần bản sao):

df.loc[(df["a"] == 1) & (df.index < 2), "c"] = 2 
print (df) 
    a b c 
0 1 2 2 
1 1 3 2 
2 1 1 3 
3 1 4 4 
4 2 5 5 
5 2 6 6 
6 2 7 7 
7 2 2 8 

Một giải pháp:

mask = df["a"] == 1 
mask = mask & (mask.cumsum() < 3) 

df.loc[mask.index[:2], "c"] = 2 
print (df) 
    a b c 
0 1 2 2 
1 1 3 2 
2 1 1 3 
3 1 4 4 
4 2 5 5 
5 2 6 6 
6 2 7 7 
7 2 2 8 
4

Một cách bẩn sẽ :

df.loc[df[df['a']==1][:2].index, 'c'] = 2 
+1

Tôi không nghĩ rằng điều này là bẩn! Đây là một ví dụ về một lớp cắt, vị trí của nó nằm dọc theo một trục và theo chỉ mục trên một trục khác. – piRSquared

+1

Tôi đã có thể lưu một char: 'df.loc [df.index [df.a == 1] [: 2], 'c'] = 2' – piRSquared

+0

@piRSquared Tôi thường không thích sự lặp lại trong' df [df [col] == some_value] 'cú pháp và ở đây nó trở thành' df [df [df ['... Đó là lý do tại sao tôi gọi nó là bẩn. :) – ayhan

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