인프런 커뮤니티 질문&답변

빅분기수강생님의 프로필 이미지

작성한 질문수

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

기출 2 작업형 1 - 문제 1 질문입니다

해결된 질문

24.06.13 17:18 작성

·

89

0

문제 1

주어진 데이터셋(members.csv)의 'views' 컬럼 상위 10개 데이터를 상위 10번째 값으로 대체한 후 'age'컬럼에서 80 이상인 데이터의 'views' 컬럼 평균값 구하기

 

처음에는 이렇게 풀었습니다.

df["views"].sort_values(ascending=False).head(10)        ## 상위 10번째 값은   9690.0
t10 = df["views"].sort_values(ascending=False).iloc[9]    ##  9690.0

df["views"] = df["views"].sort_values(ascending=False).reset_index(drop=True)

df["views"].iloc[:10] = t10

# df.head(15)

cond = df["age"] >= 80

df[cond]["views"].mean()       #  4625.380952380952 로 나옴

# # <ipython-input-49-9959c4a1efa3>:13: SettingWithCopyWarning: 
# # A value is trying to be set on a copy of a slice from a DataFrame
# # See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
# #   df["views"].iloc[:10] = t10
4625.380952380952 로 나옴

 

두번째는 이렇게 풀었습니다

df = df.sort_values(["views"], ascending= False).reset_index(drop=True)

# df.head(10)
top10 =  df["views"].iloc[9]        ##   9690.0

df["views"].iloc[:10]  = top10

# df.head(11)

cond = df["age"] > 80

df[cond]["views"].mean()         #    5660.318181818182    로 나옴
# <ipython-input-65-22f967dbf31d>:10: SettingWithCopyWarning: 
# A value is trying to be set on a copy of a slice from a DataFrame
# See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
#   df["views"].iloc[:10]  = top10
5660.318181818182    로 나옴

그런데

풀이 부분을 보니 답이 5674.04347826087 로 나오더라고요...

 

 

첫번째는 df의 "views" 칼럼 소팅해서 기존 칼럼에 대입하는 식으로 한

df["views"] = df["views"].sort_values(ascending=False).reset_index(drop=True)

부분이 잘못 된거 같아서

 

두번째 풀 때

df 전체에서 "views"칼럼 지정해서 소팅하는 아래 처럼 했고

df = df.sort_values(["views"], ascending= False).reset_index(drop=True)

상위 10번째 값 구했고 조건 변수 설정해서 한건데...

왜 풀이랑 결과값이 다를까요....??

 

 

 

 

 

 

 

답변 2

0

퇴근후딴짓님의 프로필 이미지
퇴근후딴짓
지식공유자

2024. 06. 13. 22:01

다른 곳에서 차이가없다면 위 아래 cond 조건이 다르네요!

빅분기수강생님의 프로필 이미지

2024. 06. 14. 12:48

코드 안 건들고

cond = df["age"] >= 80 되어있는거

런타임 - 세션 다시 시작 -코드 재실행하니 되네요....

어제는 왜 안되었을까요....

답변 감사합니다.

퇴근후딴짓님의 프로필 이미지
퇴근후딴짓
지식공유자

2024. 06. 14. 17:45

그럴 때가 있습니다 ㅎㅎ

0

인프런 AI 인턴님의 프로필 이미지

2024. 06. 13. 17:21

안녕하세요, 인프런 AI 인턴입니다. 빅분기수강생님.

주어진 질문과 유사한 상황의 해결 방법을 설명하는 기존의 질문&답변을 찾았습니다. 여기서는 views 컬럼의 상위 10개 데이터를 대체하는 과정과, age 컬럼에서 특정 조건에 맞는 데이터의 평균 값을 구하는 문제에 대한 질문이었습니다. 구체적인 답변 내용과 그 해결 방법은 다음과 같습니다.

유사한 질문 1

2회 기출 작업형 1문 풀이 질문있습니다.“에서는 데이터셋의 views 컬럼 상위 10개 데이터를 상위 10번째 값으로 대체한 후, 그중 age 컬럼에서 80 이상인 데이터의 views 컬럼 평균값을 구하는 문제에 대해 논의되었습니다. 이 질문에서도, 데이터를 정렬한 후 상위 10번째 값을 상위 10개 데이터에 대체하고, 특정 조건(age >= 80)을 만족하는 데이터에 대한 평균값을 구하는 과정이 포함되어 있었습니다.

답변에서 강조된 부분

답변에서는 데이터를 처리하는 과정에서 정렬과 조건 필터링을 통한 분석 방법에 대해 설명하고 있습니다. 특히, 데이터를 정렬하고, 조건에 따른 데이터의 처리 방법을 명확히 이해하는 것이 중요함을 강조하고 있습니다.

질문자님의 경우, 두 가지 방법으로 문제를 해결하려고 시도했으나, 최종 결과값이 기대한 것과 달랐던 점에 대해 궁금해 하셨습니다. 이러한 차이가 발생한 주요 원인 중 하나는 데이터 처리 과정에서 SettingWithCopyWarning 경고가 발생했다는 점을 주목할 필요가 있습니다. 이는 판다스에서 대체나 수정 작업을 수행할 때, 원본 데이터의 복사본에서 작업을 수행하려고 할 때 발생할 수 있는 경고입니다. 따라서, 데이터를 수정하거나 대체할 때는 .loc 등을 사용하여 명시적으로 해당하는 데이터 범위를 지정하는 것이 중요합니다.

본질적으로, 질문자님의 문제 해결 방식은 기본적인 로직에 있어서는 올바르나, 특정 부분에서의 데이터 처리법(특히 SettingWithCopyWarning과 관련된)에 있어 보다 세심한 접근 방법이 필요할 것으로 보입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.