이 Pandas 데이터 프레임이 있습니다.
df = pd.DataFrame({'site': ['a', 'a', 'a', 'b', 'b', 'b', 'a', 'a', 'a'], 'day': [1, 1, 1, 1, 1, 1, 2, 2, 2],
'hour': [1, 2, 3, 1, 2, 3, 1, 2, 3], 'clicks': [100, 200, 50, 0, 0, 0, 10, 0, 20]})
# site day hour clicks
# 0 a 1 1 100
# 1 a 1 2 200
# 2 a 1 3 50
# 3 b 1 1 0
# 4 b 1 2 0
# 5 b 1 3 0
# 6 a 2 1 10
# 7 a 2 2 0
# 8 a 2 3 20
그리고 클릭 수가 0 인 사이트 / 일의 모든 행을 제거하고 싶습니다. 따라서 위의 예에서 site = 'b'및 day = 1 인 행을 제거하고 싶습니다.
기본적으로 그룹화하여 하루 / 사이트의 합계가 0 인 위치를 표시 할 수 있습니다.
print(df.groupby(['site', 'day'])['clicks'].sum() == 0)
그러나 이제 해당 조건이 적용되는 원래 데이터 프레임에서 행을 제거하는 간단한 방법은 무엇입니까? 지금까지 내가 가지고있는 해결책은 그룹을 반복하고 사이트 / 일의 모든 튜플을 목록에 저장 한 다음 해당 사이트 / 일 조합이있는 모든 행을 개별적으로 제거하는 것입니다. 작동하지만 그 결과를 얻기 위해 더 기능적이고 우아한 방법이 있어야한다고 확신합니다.
groupby
, transform
및 부울 색인 :df[df.groupby(['site', 'day'])['clicks'].transform('sum') != 0]
산출:
site day hour clicks
0 a 1 1 100
1 a 1 2 200
2 a 1 3 50
6 a 2 1 10
7 a 2 2 0
8 a 2 3 20
groupby
및 사용 filter
:df.groupby(['site', 'day']).filter(lambda x: x['clicks'].sum() != 0)
산출:
site day hour clicks
0 a 1 1 100
1 a 1 2 200
2 a 1 3 50
6 a 2 1 10
7 a 2 2 0
8 a 2 3 20
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다