11. 행 삭제하기

  • 조건을 넣어 True인 값만 출력하도록 하면 조건에 맞지 않는 값은 삭제된 것과 같은 상태
import pandas as pd

df = pd.read_csv('titanic.csv')
# 데이터프레임에서 Sex열의 값이 male이 아닌 것 즉, female인 것만 출력, male은 삭제되고 female인 것만 출력됨
df[df['Sex'] != 'male'].head(2)

# 행의 인덱스를 사용해 하나의 행을 삭제할 수 있음
# 인덱스가 0인 행만 제외하고 나머지 출력
df[df.index != 0].head(2)

 

 

12. 중복된 행 삭제하기

  • drop_duplicates 사용(매개변수 사용에 주의)
# drop_duplicates를 매개변수 없이 사용하면 완벽하게 같은 행만 삭제되어 예시로 사용하는 타이타닉 데이터에서는 삭제되는 열이 없음
print('원본 데이터프레임 행의 수: {}'.format(len(df)))
print('drop_duplicates 사용한 데이터프레임 행의 수: {}'.format(len(df.drop_duplicates())))

# 출력 결과
원본 데이터프레임 행의 수: 891
drop_duplicates 사용한 데이터프레임 행의 수: 891
# 따라서 중복을 비교할 열을 subset 매개변수에 전달하여야 함
# Sex 변수에서 중복되는 값이 전부 제거되고 제일 처음 male값을 가지는 행과 female 값을 가지는 행만 남아 출력됨
df.drop_duplicates(subset = ['Sex'])

# keep 매개변수에 last를 전달하면 가장 마지막에 남은 male값과 female값만 하나씩 출력됨
df.drop_duplicates(subset = ['Sex'], keep = 'last')

 

 

13. 값에 따라 행을 그룹핑하기

  • groupby('그루핑할 열')['통계 계산을 할 열'].통계계산(mean, sum, count 등)
# 성별로 그루핑하여 각 성별의 나이 평균 계산
df.groupby('Sex')['Age'].mean()

# 출력 결과
Sex
female    27.915709
male      30.726645
Name: Age, dtype: float64

 

  • 첫 번째 열로 그루핑한 다음 두 번째 열로 다시 그룹핑하기
# 성별로 구루핑 하고 각 성별 중 생존 여부에 따라 다시 그루핑
# 이후 총 4개의 그룹 각각의 나이 평균 계산
df.groupby(['Sex', 'Survived'])['Age'].mean()

# 출력 결과
Sex     Survived
female  0           25.046875
        1           28.847716
male    0           31.618056
        1           27.276022
Name: Age, dtype: float64

 

 

14. 시간에 따라 행을 그루핑하기

  • 시간을 인덱스로 하는 예시 데이터프레임 생성
import pandas as pd
import numpy as np

# 2023/06/26부터 30초 간격으로 100,000개의 시간 데이터를 인덱스로 생성
time_index = pd.date_range('06/26/2023', periods = 100000, freq = '30s')

# 위에서 생성한 시간 인덱스를 인덱스로하고, 1~10사이의 숫자 중 랜덤하게 100,000개를 뽑은 것을 각 시간의 값으로 생성
df = pd.DataFrame(index = time_index)
df['Sale_Amount'] = np.random.randint(1, 10, 100000)

df

# 일주일 단위로 행을 그루핑
df.resample('W').sum()

  • 시간 단위
    • 'W': 1주 단위
    • '2W': 2주 단위
    • 'M': 1달 단위
    • 'MS': 1달 단위, 그루핑된 인덱스를 월의 시작 날짜로
  • label = 'left' 옵션: 인덱스를 그루핑된 그룹의 마지막 레이블이 아닌 그 전 그룹의 마지막 레이블로 변환
df.resample('M').sum()
df.resample('M', label = 'left').sum()
df.resample('MS').sum()

'M'
'M', label = 'left'
'MS'

 

 

15. 열 원소 순회하기

  • 데이터프레임의 열을 시퀀스처럼 다룰 수 있음
# 데이터프레임의 ['Name']열에 속한 값들을 하나씩 차례대로 name으로 지정하여 출력(상위 2개의 열에만 예시로 적용)
for name in df['Name'][0:2]:
    print(name.upper())

 

 

16. 모든 열 원소에 함수 적용하기

  • 데이터프레임의 특정 열의 모든 값에 동시에 함수를 적용
# 문자를 대문자로 출력하는 함수 생성
def uppercase(x):
    return x.upper()

# 위에서 생성한 함수를 데이터프레임의 'Name'열에 한번에 적용(상위 2개의 열에만 예시로 적용)
df['Name'].apply(uppercase)[0:2]

 

  • map 함수도 apply 함수와 비슷하지만 map 메서드는 딕셔너리를 입력으로 넣을 수 있고 apply 메서드는 매개변수를 지정할 수 있음
# 딕셔너리 형태로 Survived 열의 1값은 Live, 0값은 Dead로 변경
df['Survived'].map({1 : 'Live', 0 : 'Dead'})[:5]

 

  • apply 메서드에서 age라는 매개변수 전달
# age = 30이라는 매개변수 전달, Age열의 값이 전달받은 age보다 작은지에 대한 boolean 값 return
df['Age'].apply(lambda x, age: x < age, age = 30)[:5]

 

  • applymap 메서드로 전체 데이터프레임에 함수 적용 가능
# 문자값으로 이루어진 열에 대해 최대 길이를 20자로 제한하는 함수
def truncate_string(x):
    if type(x) == str:
        return x[:20]
    else:
        return x

전체 데이터프레임에 적용
df.applymap(truncate_string)[:5]

 

 

17. 그룹에 함수 적용하기

# Sex열로 그루핑하여 male 그룹과 female 그룹의 다른 열들 각각에 lambda 함수 적용
df.groupby('Sex').apply(lambda x: x.count())

 

 

18. 데이터프레임 연결하기

  • concat 함수
data_a = {'id': ['1', '2', '3'],
          'first': ['Alex', 'Amy', 'Allen'],
          'last': ['Anderson', 'Ackerman', 'Ali']}
df_a = pd.DataFrame(data_a, columns = ['id', 'first', 'last'])

data_b = {'id': ['4', '5', '6'],
          'first': ['Billy', 'Brian', 'Bran'],
          'last': ['Bonder', 'Black', 'Balwner']}
df_b = pd.DataFrame(data_b, columns = ['id', 'first', 'last'])

df_a
df_b

df_a
df_b

 

  • concat 함수에 axis = 0으로 하면 행 방향으로 데이터프레임 연결
pd.concat([df_a, df_b], axis = 0)

 

  • concat 함수에 axis = 1로 하면 열 방향으로 데이터프레임 연결
pd.concat([df_a, df_b], axis = 1)

 

 

19. 데이터프레임 병합하기

  • merge 함수
employee_data = {'employee_id': ['1', '2', '3', '4'],
                 'name': ['Amy Jones', 'Allen Keys', 'Alice Bees', 'Tim Horton']}
df_employees = pd.DataFrame(employee_data, columns = ['employee_id', 'name'])

sales_data = {'employee_id': ['3', '4', '5', '6'],
              'total_sales': [23456, 2512, 2345, 1455]}
df_sales = pd.DataFrame(sales_data, columns = ['employee_id', 'total_sales'])

df_employees
df_saeles

df_employees
df_sales

 

  • merge는 기본적으로 내부 조인을 실행(기준으로 하는 열(on = ''으로 지정한 열)이 같은 데이터만 병합하여 출력)
# 두 데이터프레임에서 employee_id가 두 곳 모두에 있는 값은 3, 4이므로 3, 4에 대해서만 다른 데이터가 병합되어 출력됨
pd.merge(df_employees, df_sales, on = 'employee_id')

 

  • how = '' 매개변수를 지정하여 outer, right, left 조인도 실행 가능
  • left, right 조인은 데이터프레임을 매개변수로 주는 순서에 따라 결과가 달라지므로 주의
pd.merge(df_employees, df_sales, on = 'employee_id', how = 'outer')

pd.merge(df_employees, df_sales, on = 'employee_id', how = 'left')

pd.merge(df_employees, df_sales, on = 'employee_id', how = 'right')

 

  • left와 right의 조인 기준열을 각각 지정할 수도 있음
pd.merge(df_employees, df_sales, left_on = 'employee_id', right_on = 'employee_id')

+ Recent posts