본문 바로가기
  • 블랜더 거실
IT인터넷/Python

[디지털 문해력]Python으로 시작하는 데이터 분석_Pandas 심화(211002)

by bandiburi 2021. 10. 2.

○ Numpy array와 마찬가지로 masking 연산이 가능하다

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(5,2), columns=["A", "B"])
df["A"] < 0.5

○ 조건에 맞는 DataFrame row를 추출 가능

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(5, 2), columns=["A","B"])
df[(df["A"] < 0.5) & (df["B"] > 0.3)]
df.query("A < 0.5 and B > 0.3")

○ 문자열이라면 다른 방식으로도 조건 검색이 가능하다

df["Animal"].str.contains("Cat")
df.Animal.str.match("Cat")

○ 함수로 데이터 처리하기
[apply] 를 통해서 함수로 데이터를 다룰 수 있다. 

df = pd.DataFrame(np.arange(5), columns=["Num"])
def square(x) : 
      return x**2
df["Num"].apply(square)
df["Square"] = df.Num.apply(lambda x: x**2)
df = pd.DataFrame(columns=["Phone"])
df.loc[0] = "010-1234-1235"
df.loc[1] = "공일공-일이삼사-일이삼오"
df.loc[2] = "010.1234.일이삼오
df["preprocess_phone"] = ' '
def get_preprocess_phone(phone):
    mapping_dict = {
        "공" : "0", 
        "일" : "1",
            ...
         "_" : "",
         "+" : ""
    }
for key, value in mapping_dict.items():
      phone = phone.replace(key, value)
return phone
df["preprocess_phone"] = df["phone"].apply(get_preprocessed_phonenumber)
replace:apply 기능에서 데이터 값만 대체 하고 싶을 때
df.Sex.replace({"Male" : 0, "Female" : 1})
df.Sex.replace({"Male" : 0, "Female" : 1}, inplace=True)

[multiindex] 인덱스를 계층적으로 만들 수 있다. 

df = pd.DataFrame(
    np.random.randn(4,2),
    index=['A','A','B','B'],[1,2,1,2],
    columns=['data1','data2'])

열 인덱스도 계층적으로 만들 수 있다. 
df = pd.DataFrame(
   np.random.randn(4,4),
   columns=[["A","A","B","B"], ["1","2","1","2"]])

다중 인덱스 칼럼의 경우 인덱싱은 계층적으로 한다. 
인덱스 탐색의 경우에는 loc, iloc를 사용가능하다

df["A"]
df["A"]["1"]


[실습1]
import numpy as np
import pandas as pd

df1 = pd.DataFrame(
    np.random.randn(4, 2), 
    index=[['A', 'A', 'B', 'B'], [1, 2, 1, 2]],
    columns=['data1', 'data2']
)
print("DataFrame1")
print(df1, "\n")

df2 = pd.DataFrame(
    np.random.randn(4, 4),
    columns=[["A", "A", "B", "B"], ["1", "2", "1", "2"]]
)
print("DataFrame2")
print(df2, "\n")

# 명시적 인덱싱을 활용한 df1의 인덱스 출력
print("df1.loc['A', 1]")
print(df1.loc['A', 1], "\n") 

# df2의 [A][1] 칼럼 출력
print('df2["A"]["1"]')
print(df2["A"]["1"], "\n")

○ 그룹으로 묶기 :  

[groupby] 간단한 집계를 넘어서서 조건부로 집계하고 싶은 경우

df = pd.DataFrame({'key' : ['A', 'B', 'C', 'A', 'B', 'C'], 'data1' : [1,2,3,1,2,3], 'data2' : np.randaom.randint(0, 6, 6)})
df.groupby('key')
df.groupby('key').sum()
df.groupby(['key', 'data1']).sum()

[aggregate] groupby를 통해서 집계를 한번에 계산하는 방법

df.groupby('key').aggregate(['min', np.median. max])
df.groupby('key').aggregate({'data1' : 'min', 'data2' : np.sum})

[filter] groupby를 통해서 그룹 속성을 기준으로 데이터 필터링

def filter_by_mean(x) : 
    return x['data2'].mean() > 3
df.groupby('key').mean()
df.groupby('key').filter(filter_by_mean)

[apply] groupby를 통해서 묶인 데이터에 함수 적용

df.groupby('key').apply(lambda x : x.max() - x.min())

[get_group] groupby로 묶인 데이터에서 key값으로 데이터를 가져올 수 있다. 

df = pd.read.csv("./univ.csv")
df.head()
df.groupby("시도").get_group("충남")
len(df.groupby("시도").get_group("충남")) #94

 

[실습2] 그룹으로 묶기

import numpy as np
import pandas as pd

df = pd.DataFrame({
    'key': ['A', 'B', 'C', 'A', 'B', 'C'],
    'data1': [1, 2, 3, 1, 2, 3],
    'data2': [4, 4, 6, 0, 6, 1]
})
print("DataFrame:")
print(df, "\n")

# groupby 함수를 이용해봅시다.
# key를 기준으로 묶어 합계를 구해 출력해보세요.
df.groupby('key')
df1 = df.groupby('key').sum()
print(df1)

# key와 data1을 기준으로 묶어 합계를 구해 출력해보세요.
df2 = df.groupby(['key','data1']).sum()
print(df2)
실습-이론4:그룹으로 묶기
import numpy as np
import pandas as pd

df = pd.DataFrame({
    'key': ['A', 'B', 'C', 'A', 'B', 'C'],
    'data1': [0, 1, 2, 3, 4, 5],
    'data2': [4, 4, 6, 0, 6, 1]
})
print("DataFrame:")
print(df, "\n")

# aggregate를 이용하여 요약 통계량을 산출해봅시다.
# 데이터 프레임을 'key' 칼럼으로 묶고, data1과 data2 각각의 최솟값, 중앙값, 최댓값을 출력하세요.
df1 = df.groupby('key').aggregate(['min',np.median,'max'])
print(df1)

# 데이터 프레임을 'key' 칼럼으로 묶고, data1의 최솟값, data2의 합계를 출력하세요.
df2 = df.groupby('key').aggregate({'data1':'min', 'data2':np.sum})
print(df2)
실습-이론5:그룹으로 묶기
import numpy as np
import pandas as pd

df = pd.DataFrame({
    'key': ['A', 'B', 'C', 'A', 'B', 'C'],
    'data1': [0, 1, 2, 3, 4, 5],
    'data2': [4, 4, 6, 0, 6, 1]
})
print("DataFrame:")
print(df, "\n")

# groupby()로 묶은 데이터에 filter를 적용해봅시다.
# key별 data2의 평균이 3이 넘는 인덱스만 출력해봅시다.

print("filtering : ")
def filter_by_mean(x) : 
    return x['data2'].mean() >3
df1 = df.groupby('key').filter(filter_by_mean)
print(df1)

# groupby()로 묶은 데이터에 apply도 적용해봅시다.
# 람다식을 이용해 최댓값에서 최솟값을 뺀 값을 적용해봅시다.

print("applying : ")
df2 = df.groupby('key').apply(lambda x : x.max() - x.min())
print(df2)


[pivot_table]

index는 행 인덱스로 들어갈 key
column에 열 인덱스로 라벨링될 값
value에 분석할 데이터

예) 타이타닉 데이터에서 성별과 좌석별 생존률 구하기
df.pivot_table(
 index = 'sex', columns='class', values = 'survived'
 aggfunc=np.mean)
예)2
df.pivot_table(
  index="월별", columns='내역', valules=["수입",'지출'])

[실습3] 피리부는 사나이를 따라가는 아이들

import pandas as pd
import numpy as np

#elice_utils = EliceUtils()

def main():

# 파일을 읽어서 코드를 작성해보세요
# 경로: "./data/the_pied_piper_of_hamelin.csv"

    df = pd.read_csv("./data/the_pied_piper_of_hamelin.csv")
    children = df[df["구분"] == "Child"]
    print(children.groupby("일차").mean())
    
    children1 = children.pivot_table(
        index = "일차", columns = "성별", values = "나이",
        aggfunc=np.mean)

    print(children1)
if __name__ == "__main__":
    main()

728x90
반응형

댓글