인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

Jh Kim님의 프로필 이미지
Jh Kim

작성한 질문수

남박사의 파이썬 기초부터 실전 100% 활용

조건문 (if, else, elif)

같은조건이라면 합계를 구하는 방법이 if else로 가능할지 궁금합니다

해결된 질문

작성

·

488

2

안녕하세요 박사님

좋은 강의 잘보고 있습니다

if else 강의 중에 원하는 값을 알고있을때의 조건문은 가능하지만 원하는 값이 아니라 같은조건일때 합계를 구하는거에

의문이 생겨 여쭙습니다.

아래의 데이타 프레임이 있습니다.

name    food        price

홍길동    볶음밥     5600

홍길동    떡볶이     6000

가가멜    볶음밥     5600

가제트    탕수육     6200

가가멜    볶음밥     5600

홍길동    볶음밥     5600

 name과 food가 같은값일때 price의 합계를 구하려면

if  df['name'] == df['name'] and df['food'] == df['food'] :

    df[ 'price'].sum()

이런식으로 도 가능할까요?

답변 1

2

남박사님의 프로필 이미지
남박사
지식공유자

일단 전체코드를 보지 않아서 어떤 의견을 드리기가 애매합니다만..

일단 위의 데이터가 어디에 어떤 형태로 존재하는지를 알아야 할듯 합니다. 그래야 데이터를 어떻게 관리할지가 판단되기 때문입니다. 

if df["name"] == df["name"] 

이런식의 형태 역시 데이터를 어떻게 보관하고 있냐를알아야 답변드릴 수 있어보입니다.

보통 복수개의 데이터로 존재할텐데 그렇게 되면 for 문이나 while 문의 반복문이 필요할테고 그럴경우에는 위 처럼 사용하실수가 없습니다. 

일단 만약 df["name"] 의 자료형태가 dict 라면 sum() 이라는 메소드가 없습니다.

따라서 이런경우라면 변수를 따로 선언해서 

tot_price += df['price']

이렇게 tot_price 변수에 값을 누적시켜서 사용해야 할듯 보입니다.

df['price'] += df['price'] 

이렇게 그냥 그 값에 누적을 시킬수도 있습니다만 이 경우에는 원래 값 df['price'] 가 변하기 때문에 만약 로직에서 df["price"] 값을 재사용하게 된다면 프로그램에 의도치 않은 계산 오류가 생기게 됩니다.

datas = [
    ["홍길동", "볶음밥", 5600],
    ["홍길동", "떢볶이", 6000],
    ["가가멜", "볶음밥", 5600],
    ["가제트", "탕수육", 6200],
    ["가가멜", "볶음밥", 5600],
    ["홍길동", "볶음밥", 5600]
]

# 누적된 결과 데이터를 저장할 리스트 변수를 새로 선언합니다.
result_lists = []

# 데이터에서 서로 중복되는 값을 체크하기 위해서 2중 for 문을 돌아야 서로 비교를 할 수 있습니다.
# 이렇게 2중 for문을 도는게 가장 일반적인 방법 입니다.
# 안쪽 for 문의 시작값은 0 이 아니라 바깥쪽 for 문의 인덱스 + 1 을 해야 합니다.
for i in range(0, len(datas)):
    for j in range(i + 1, len(datas)):
        # i 번째 데이터와 j 번째 데이터를 비교합니다. 쉽게 현재데이터와 다음데이터를 비교하는 방법입니다.
        if(datas[i][0] == datas[j][0] and datas[i][1] == datas[j][1]):
            result_lists.append({
                datas[i][0],
                datas[i][1],
                datas[i][2] + datas[j][2]
                })

print(result_lists)

질문 내용을 일반적인 리스트 형태로서 구현하자면 위와비슷하게 구현하실 수 있습니다.

결국에 result_lists 라는 리스트 변수를 따로 선언해서 결과를 처리하는 방식입니다.

만약 df 의 자료형태가 pandas 의 데이터 프레임을 사용한거라면 (제강좌에서 판다스에 대해선 소개하지 않았습니다만.)

import pandas

df = pandas.DataFrame({
    "name": ["홍길동", "홍길동", "가가멜", "가제트", "가가멜", "홍길동"],
    "food": ["볶음밥", "떡볶이", "볶음밥", "탕수육", "볶음밥", "볶음밥"],
    "price": [5600, 6000, 5600, 6200, 5600, 5600]
    })

# food 가 볶음밥인 경우의 데이터프레임을 새롭게 생성하고 
df2 = df[df["food"] =="볶음밥"]

# 새롭게 생성된 데이터프레임에서 다시 홍길동이 있는데이터의 sum() 을 구하고 price를 출력
print(df2[df2["name"] == "홍길동"].sum()["price"])

pandas를 사용하는 경우에는 위와 같이 처리할 수도 있습니다만 pandas에 해서는 강좌에서 다루지 않은 내용이고 pandas자체의 사용법은 뭐 다른 라이브러리랑 별반 다를건 없지만 데이터분석에서 많이 사용하는 만큼 내가 원하는 적재적소의 상황에서 자유롭게 다룰려면 많은 공부와 연습을 해보셔야하는 부분이긴 합니다.

아무튼 위의 답변이 도움되셨길 바랍니다. 더 궁금하신점 있으면 질문 주세요

Jh Kim님의 프로필 이미지
Jh Kim

작성한 질문수

질문하기