기타/Python

250628_판다스(조회, 정렬, 조건필터, 통계, 복사와 결측치)

baektree 2025. 6. 30. 20:46

요약/나만의 인사이트

  • 데이터 분포 확인하기 .value.counts()
    • embark_town 컬럼에 대해 데이터 분포 확인하기 df[’embark_town’].value_counts()
    • who 컬럼에 대해 데이터 분포 확인하기 df[’who’].value_counts()
  • 정렬하기 .sort_values(by=[ ], ascending=[ ])
    • total_bill과 tip에 대한 내림차순 정렬하기 tips.sort_values(by=[’total_bill’, ‘tip’], ascending=[False, False])
    • size를 기준으로 내림차순, tip을 기준으로 오름차순 정렬하기 tips.sort_values(by=[’size’, ‘tip’], ascending=[False, True])
  • 인덱싱, 슬라이싱 df.loc[행, 열]
    • 3행부터 7행까지 슬라이싱 df.loc[3 : 7]
    • 처음부터 4행까지, plcass에서 fare컬럼까지 슬라이싱 df.loc[:4, ‘plcass’:’fare’]
    • 2행부터 10행까지 2씩 점프하는 행부터, ‘age’와 ‘who’컬럼만 인덱싱 df.loc[np.arange(2, 11, 2), [’age’, ‘who’]]
  • 조건을 만족하는 코드 condition , .isin()
    • 나이가 30살 이상 남자 승객 조건 필터링 condition1 = df[’age] ≥ 30 condition2 = df[’who’] == ‘man’
    • fare를 많이 낸 순으로 내림차순 정렬 df.loc[condition1 & condition2].sort_values(by=’fare’, ascending=False)

    • 나이가 20살 이상 40살 미만인 승객 condition1 = (df[’age’] ≥ 20) & ( df[’age’] ≤40 )
    • pclass가 1등급 혹은 2등급인 승객 condition2 = df[’pclass’] < 3
    • 컬럼은 survived, pclass, age, fare 만 나오게 출력 df.loc[condition1 & condition2, [’survived’, ‘plcass’, ‘age’, ‘fare’]]

    • tips 데이터셋 중 day가 Fri, Sat만 필터링 condition1 = tips[’day’].isin([’Fri’, ‘Sat’])
    • tip이 10$보다 적게 낸 데이터만 필터링 condition2 = tips[’tip'] < 10
    • 컬럼은 total_bill, tip, smoker, time만 출력 tips.loc[condition1 & condition2, [’total_bill’, ‘tip’, ‘smoker’, ‘time’]]

새롭게 알게 된 것

  • loc , iloc 특정 값들을 찾는다.
    • loc
      • location의 약어
      • 데이터 프레임의 행 또는 컬럼의 label이나 boolean array로 인덱싱하는 방법
      • 사람이 읽을 수 있는 라벨 값으로 특정 값들을 골라오는 방법
      • df.loc[행 인덱싱 값, 열 인덱싱 값]
    • iloc
      • integer location의 약어
      • 데이터 프레임의 행이나 컬럼의 순서를 나타내는 정수로 특정 값을 추출하는 방법
      • 즉 숫자로 데이터가 있는 위치에 접근한다고 생각하면 쉬움
      • df.iloc[행 인덱스, 열 인덱스]
  • isin
    • 특정 값의 포함 여부를 확인하는 함수
    • loc를 활용한 조건 필터링으로 자주 쓰임.
    #name 컬럼에 kim과 lee가 있는 것만 필터링
    sample.loc[sample['name'].isin(['kim', 'lee')]
    
  • 분산, 표준편차, 제곱근 영어로
    • 분산 : variance → df[’fare’].var()
    • 표준편차 : standard deviation → df[’fare’].std()
    • 표준편차 : square root → np.sqrt(df[’fare’].var())
      • 여기서 square root라는 넘파이 제곱근 함수 사용했음을 알 수 있음.
  • agg - aggreation 통합 통계 적용
  • df[’age’].agg([’min’, ‘max’, ‘count’, ‘mean’]) df[[’age’, ‘fare’]].agg([’min’, ‘max’, ‘count’, ‘mean’])
  • quantile() - 분위
    • 주어진 데이터를 동등한 크기로 분할하는 지점
    • 10%의 경우 0.1을 80%의 경우 0.8d을 대입하여 값을 구한다.
    df['age'].quantile(0.1) #14.0
    
  • mode() - 최빈값
  • penguin['island'].mode()
  • dropna()
    • dropna(how=’any’) : 1개라도 NaN값이 있는 행을 제거, ()안을 적지 않을 경우 기본값으로 적용 됨.
    • dropna(how=’all’) :모두 NaN값이 존재시 제거
    • 참고 NaN = Not a Number의 약자, 데이터 처리에 숫자가 있어야 할 자리에 결측치가 있다.
  • inplace =True
    • 원본 데이터를 바로 바꿔라라는 의미
  • 행/열 삭제
    • 열 삭제
      • df1.drop('class', axis=1)
      • 여기서 axis는 축이라는 뜻 axis=1은 열을 의미

특히 어려웠던 것

  • 남자 승객만 평균 구해서 결측치에만 값 넣기
  • #남자 승객만 필터링
    male = ( df['sex'] == 'male')
    
    #남자 승객의 나이 평균 구하기
    male_mean = df.loc[male, 'age'].mean()
    
    #남자 승객 나이 결측치에 평균 넣기
    df.loc[male, 'age']= df.loc[male, 'age'].fillna(male_mean)
    
  •  fillna()
      • fillna()는 원본 데이터를 바꾸지 않고 새로운 시리즈를 반환함.
      • 그래서 반드시 결과를 다시 할당해야 함.
      • df.loc[male, 'age']에 값에 할당해서 df안의 값이 바뀜.
      • df2 = df.fillna(0) : df는 그대로고 df2에 결측치가 채워진 버전이 있음.
      • df.fillna(0, inplace=True) : null값을 0으로 바꾼 결과를 반환하지 않고 df자체가 바로 수정됨
  • #남자 승객만 필터링 male = ( df['sex'] == 'male') #남자 승객의 나이 평균 구하기 male_mean = df.loc[male, 'age'].mean() #남자 승객 나이 결측치에 평균 넣기 df.loc[male, 'age']= df.loc[male, 'age'].fillna(male_mean)

다음에 적용해 볼 것

  • [ ] 복사와 결측치 할 차례