2016-10-22 10 views
1

100000 행을 포함하는 데이터 프레임 (ratings_base)이 있습니다. 나는 그것으로부터 하나의 행을 필터링하고 그것을 위해 다음 코드 세그먼트를 사용했다. 나에게 Series 객체를 반환팬더 데이터 프레임에서 필터링 후 행 삭제

((ratings_base.loc[ratings_base['user_id'] == 1]).sort_values(by='rating', ascending=0)).iloc[0]

.

user_id  1 
movie_id 170 
rating  5 
Name: 19996, dtype: int64 

원본 데이터 프레임 개체에서이 행 (시리즈 개체)을 삭제하려면 어떻게해야합니까? 데이터 프레임의 드롭 함수를 사용할 수 있지만 행 인덱스가 필요합니다. 선택한 행의 행 인덱스를 가져올 수 있으면 (Series 객체의 Name 속성으로 나타남) 드롭 할 수 있습니다.

답변

1

df.loc[0]은 첫 번째 행을 선택합니다. df.loc[1:]은 첫 번째 행 뒤의 모든 항목을 선택합니다.

그래서 당신은

ratings_base = ((ratings_base.loc[ratings_base['user_id'] == 1]) 
       .sort_values(by='rating', ascending=0)) 
ratings_base = ratings_base.iloc[1:] 

대안으로 사용할 수 있습니다, 당신은 사용할 수 df.drop : 당신이 될 일이없는 행을 삭제하고자하는 경우

row = ((ratings_base.loc[ratings_base['user_id'] == 1]) 
     .sort_values(by='rating', ascending=0)).iloc[0] 
label = row.name 
ratings_base = ratings_base.drop(label) 

이보다 유연 할 수있다 첫번째.

ratings_base.drop은 색인이 label모두 행을 삭제합니다. 색인이 고유하지 않으면 둘 이상의 행이 h 제될 수 있습니다.

+0

대안을 선호하고 나에게도 효과적입니다. 옆 질문 있으십시오. 나는 그것을 떨어 뜨리기 위해 "inplace = True"속성을 사용해야했습니다. len (rating_base)을 검사하여 삭제되었는지 확인했습니다. "inplace = True"속성이 없으면 길이는 100000이고 그 소품은 99999입니다. 이유가 무엇입니까? – Malintha

+1

'df.drop (..., inplace = True) '를 호출하면'drop'은'df'를 수정하고'None'을 반환합니다. 'df.drop (...)'를 호출하면'df'는 변경되지 않고'drop'은 새로운 DataFrame을 리턴합니다. 따라서'df'의 값을 변경하려면 할당을 사용해야합니다 :'df = df.drop (...)'. 필자는'inplace'라는 이름이 오해의 소지가 있기 때문에'inplace = True'를 피하면서 후자를 선호합니다. 임시 메모리를 저장하지 않는다는 의미에서 진정한 내부 연산이 아닙니다. 'inplace'를 피하기위한 다른 이유는 http://stackoverflow.com/a/22533110/190597을 참고하십시오. – unutbu

관련 문제