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

newtjsdud님의 프로필 이미지
newtjsdud

작성한 질문수

파이썬 for문 질문이요!

작성

·

226

·

수정됨

1

스크린샷 2024-03-22 152814.png

궁금한게 저기서 i와 j가 동일한 행을 뽑고 싶은데

해당하는 df전체 열을 뽑고 싶으면 코드를 어떻게 짜야할까요?

도와주세요..

답변 2

1

지나가다 조심스레 댓글 남겨봅니다.파이썬 데이터프레임 자료형은 브로드캐스팅이나, 배치 연산이 잘 되어 있어 가급적 for문을 쓰지 않는 걸 추천드립니다.
pythonic 하지는 않지만 pandastic 하다고 해야 할까요...
하여튼~

첫 번째 방법 : .isin()

판다스 문법 중 isin이라는 메서드가 있는데요.아래처럼 사용할 수 있습니다.녹화_2024_07_26_00_01_13_87.gifdf 의 행들 중 노선번호 칼럼의 값이 bus_name["버스번호"] 에 들어있는 행만 필터링했습니다.# 방법 1 df2 = df[df["노선번호"].isin(bus_name["버스번호"])] df2

두 번째 방법 : iterrows()

for문으로도 처리는 가능한데요.
판다스 코드를 짜는 도중에... for문 밖에 방법이 떠오르지 않는다면
챗지피티 바로 켜서 물어보시는 걸 추천드립니다..녹화_2024_07_26_00_14_44_270.gif# 방법 2 rows = [] for _, row in df.iterrows(): if row["노선번호"] in bus_name['버스번호'].values: rows.append(row) df2 = pd.DataFrame(rows) df2판다스가 묻지 않은(?) 순수한 for문을 쓰고 싶으시다면아래처럼도 해볼 수 있겠습니다.df2 = pd.DataFrame() for i in range(len(df)): if df.iloc[i]["노선번호"] in bus_name["버스번호"].values: df2 = pd.concat([df2, df.iloc[[i]]], axis=0, ignore_index=True) df2녹화_2024_07_26_00_26_26_391.gif

세 번째 방법 : apply

엄청나게 효율적인 건 아니지만, 범용으로 사용하기 참 좋은 apply를 써보면# 방법3 : apply & lambda df2 = df[df['노선번호'].apply(lambda x: x in bus_name['버스번호'].values)] df2녹화_2024_07_26_00_30_42_677.gif(isin에 비할 바는 아니지만) 코드가 뭔가 짧으면서 리스트컴프리헨션스럽고..
개인적으로 참 좋아하는 기능입니다.도움이 되었길 바랍니다^^
업데이트중인지, 코드블럭이 전부 깨지고 줄바꿈도 없어지는 오류가 있네요..

1

안녕하세요, 인프런 AI 인턴입니다.

님의 질문에 대한 답변입니다.

파이썬DataFrame에서 특정 조건에 맞는 행 전체를 뽑고 싶을 때는 보통 해당 조건을 만족하는 행을 필터링하는 방법을 사용합니다. 질문에서 ij가 동일한 값을 가지는 행을 뽑고 싶다고 하셨으므로, 두 컬럼(노선번호와 버스번호)이 일치하는 조건으로 필터링 해보겠습니다.

예를 들어, df가 DataFrame이고, bus_name이 다른 Python 객체일 때, 두 객체의 ‘노선번호’와 ‘버스번호’가 일치하는 행을 뽑으려면 아래와 같은 코드를 사용할 수 있습니다. 먼저, 두 데이터의 조건을 비교하여 일치하는 경우만 필터링해야 합니다.

하지만, 주어진 정보만으로는 bus_name 객체의 세부 구조를 정확히 알 수 없어, 정확한 코드 작성은 어렵습니다. bus_name이 딕셔너리나 다른 DataFrame인 경우 접근 방식이 다를 수 있기 때문입니다. 그래도 기본적인 아이디어를 제공하겠습니다.

DataFrame df의 ‘노선번호’ 컬럼과 bus_name의 ‘버스번호’를 비교하는 일반적인 아이디어는 다음과 같습니다:

for i in df['노선번호']:
    if i in bus_name['버스번호']:  # 이 부분은 bus_name의 구조에 따라 조정 필요
        # 조건을 만족하는 행을 출력하거나 다른 작업 수행
        print(df[df['노선번호'] == i])

위 코드는 df의 ‘노선번호’가 bus_name의 ‘버스번호’에 포함되어 있는지 확인하고, 만약 그렇다면 해당하는 df의 행 전체를 출력합니다. bus_name의 실제 구조에 따라 if i in bus_name['버스번호']: 이 부분의 조건문은 수정이 필요할 수 있습니다.

더 정확한 도움을 받고 싶으시다면 bus_name 객체의 정확한 구조나 타입(예를 들어, DataFrame, 리스트, 딕셔너리 등)에 대한 정보를 추가로 제공해 주세요.

저는 이렇게 유용한 지식이 가득한 훌륭한 세미나에 참여하고 싶습니다. 긴장을 풀고 싶다면 Fnaf or Run 3 가서 휴식을 취하세요.

 

newtjsdud님의 프로필 이미지
newtjsdud

작성한 질문수

질문하기