Pandas에서 COUNTIF와 동등한 작업을 수행하기 위해 노력하고 있습니다. 를 사용하여 머리를 돌리려고 노력하고 groupby
있지만 논리적 그룹화 조건이 동적이기 때문에 어려움을 겪고 있습니다.
고객 목록과 방문한 날이 있다고 가정 해 보겠습니다. 두 가지 논리적 조건을 기반으로 신규 고객을 식별하고 싶습니다.
Guest ID
).두 조건이 모두 충족되면 재 방문 고객입니다. 그렇지 않다면 그들은 새로운 것입니다 (따라서 newby = 1-...
새로운 고객을 식별합니다.
나는 for
루프로 이것을 할 수 있었지만 분명히 성능이 끔찍하고 이것은 팬더의 논리에 거의 위배됩니다.
다음 코드를 루프보다 더 똑똑한 것으로 어떻게 래핑 할 수 있습니까?
for i in range (0, len(df)):
newby = 1-np.sum((df["Day"] == df.iloc[i]["Day"]-1) & (df["Guest ID"] == df.iloc[i]["Guest ID"]))
이 게시물 은 상태가 정적이기 때문에 도움 이 되지 않습니다. 나는 df
많은 범주 (많은 고객 이름)를 갖고 더 복잡한 논리적 문장을 작성하고 싶기 때문에 를 전치하는 것과 같은 "더미 열"의 도입을 피하고 싶습니다. 많은 보조 컬럼으로 끝나는 위험을 감수하고 싶지 않습니다.
다음 입력이 있습니다.
df
Day Guest ID
0 3230 Tom
1 3230 Peter
2 3231 Tom
3 3232 Peter
4 3232 Peter
이 출력을 기대하십시오
df
Day Guest ID newby
0 3230 Tom 1
1 3230 Peter 1
2 3231 Tom 0
3 3232 Peter 1
4 3232 Peter 1
그 요소를 참고 3
하고 4
필요없는 복제 - (예 : 자신의 순서와) 열을 다양한 추가가있을 수 있습니다 주어진.
하다:
# ensure the df is sorted by date
df = df.sort_values('Day')
# group by customer and find the diff within each group
df['newby'] = (df.groupby('Guest ID')['Day'].transform('diff').fillna(2) > 1).astype(int)
print(df)
산출
Day Guest ID newby
0 3230 Tom 1
1 3230 Peter 1
2 3231 Tom 0
3 3232 Peter 1
최신 정보
하루에 여러 번 방문이 허용되는 경우 다음을 수행 할 수 있습니다.
# only keep unique visits per day
uniques = df.drop_duplicates()
# ensure the df is sorted by date
uniques = uniques.sort_values('Day')
# group by customer and find the diff within each group
uniques['newby'] = (uniques.groupby('Guest ID')['Day'].transform('diff').fillna(2) > 1).astype(int)
# merge the uniques visits back into the original df
res = df.merge(uniques, on=['Day', 'Guest ID'])
print(res)
산출
Day Guest ID newby
0 3230 Tom 1
1 3230 Peter 1
2 3231 Tom 0
3 3232 Peter 1
4 3232 Peter 1
대안으로 정렬 또는 병합없이 다음을 수행 할 수 있습니다.
lookup = {(day + 1, guest) for day, guest in df[['Day', 'Guest ID']].value_counts().to_dict()}
df['newby'] = (~pd.MultiIndex.from_arrays([df['Day'], df['Guest ID']]).isin(lookup)).astype(int)
print(df)
산출
Day Guest ID newby
0 3230 Tom 1
1 3230 Peter 1
2 3231 Tom 0
3 3232 Peter 1
4 3232 Peter 1
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다