파이썬/NIPA 데이터분석 강의

NIPA 데이터분석 첫번째 활용선택 : 03 Pandas 심화 -a apply group

mcdn 2020. 9. 30. 12:44
반응형

1. numpy array 와 마찬가지로 masking 연산이 가능하다. 

0.5보다 작다로 true false 만드는 걸 masking의 배경이 된다 

np.random.randint 균일 분포의 정수 난수 1개 생성

np.random.rand 0부터 1사이의 균일 분포에서 난수 matrix array생성

np.random.randn 가우시안 표준 정규 분포에서 난수 matrix array생성

random의 대표적 세개 모듈 설명 

위의 예시에서는 rand니까 0~1사이 균일 분포에서 난수 생성한 거다. 

 

2. 둘다 true인 애들이 0하고 2이다. 

df[df["a"]~ 외에도 

df.query로 줄글 써서 쉽게할 수도 있다 

3. animal 칼럼이 있다. 그리고 우리는 cat만 찾아내고 싶다 

df["animal"].str.contains("cat") cat이라는 문자열을 포함하면 true 아니면 false가 반환된다. 

다른 방식으로는 

df.Animal.str.match("cat")

df["animal"] == "cat"

정규표현식이라는 것으로 하면 더 정교한 검색이 가능하다. 

 

import numpy as np
import pandas as pd

print("Masking & query")
df = pd.DataFrame(np.random.rand(5, 2), columns=["A", "B"])
print(df, "\n")

#데이터 프레임에서 A컬럼값이 0.5보다 작고 B컬럼 값이 0.3보다 큰값들을 구해봅시다.

a = df[(df["A"] < 0.5) & (df["B"] > 0.3)]
print(a)
b = df.query("A < 0.5 and B > 0.3")
print(b)

 

 

4. apply 함수를 배워보자 함수를 인자로 받는다.

개인 함수 square를 배워본다 

그리고 NUM에 apply(square을 한다. 사실 직접 저장하기 위해서는

df["Square"] = df["Num"].apply(square)이라 써야함

 lambda표현식으로 쓸 수 도 있다. x값을 받아서 x**2를 적용하고 마찬가지로 apply를 쓴다 

 

5. 실제 전화번호로 바꿔보자. 이 번호를 처리하기 위해 함수를 만들어야 한다 

6. get_preprocess_phone에 대해 dict를 만든다 

반복문을 돌린다 dict는 key와 value 두가지가 있으니까. 

phone = phone.replace대체한다. 그리고 다 끝나면 phone을 return 한다. 

apply

7. replace 대체하고 싶을 때! 

male과 female을 0과 1로 대체한 것. 

그렇다면 뒤에 inplace=True 키워드는 뭐냐?? 

첫번째 줄의 경우 df["Sex"] = df.Sex.replace~ 로 하면 가운데 박스처럼 새 시리즈 데이터로 반환된다. 

두번째줄의 inplace덕분에 그냥 Sex를 그자리에서 모두 대체해버릴 수 있다. 고대로 

중간에 새 시리즈로 만드는 과정이 생략되는 것. 

import numpy as np
import pandas as pd

df = pd.DataFrame(np.arange(5), columns=["Num"])
print(df, "\n")

# 값을 받으면 제곱을 해서 돌려주는 함수
def square(x):
    return x**2

# apply로 컬럼에 함수 적용
df["Square"] = df["Num"].apply(square)
print(df)

# 람다 표현식으로도 적용하기
df["Square"] = df.Num.apply(lambda x : x**2)
print(df)

 

8. 다음으로 그룹을 묶는 법을 배워봅시다. 

df.groupby('key')란 묶는 연산. 실제로 아무것도 출력되진 않고 

주석에 있는 groupby.groupby.DataFrameGroupBy object at ~ 이거만 나온다. 즉 서로 사슬처럼 보이지 않게 링크되어 있는거지 뭐 아직 딱히 연산하거나 시리즈를 새로 만드는 건 아니다. 

대신 이렇게 groupby로 하면 sum()을 하면 A / B / C끼리 sum()연산을 수행할 수 있게 된다. 

다음으로 Key 와 Data1에 대해 groupby를 하게 되면 ?? 

key 랑 Data1이 함께 값이 가는 상태라서 애매하네 ------

 

9. data1에 대해 min, median max값이 채워져서 나온다. 

min, median max같이 반복되는 인덱스는 멀티 인덱스라고도 한다. 

딕셔너리로 묶어서 넣게 되면 data1에는 min값들만 data2는 np.sum값만 나타나게 된다. 

칼럼마다 어떤 연산을 수행할지를 지정할 수 있다. 

10. filter 

groupby에 키 값으로 묶은 상태에서 mean()평균값을 나오게 할 수 있다. 

근데 이때 mean()에서 3보다 큰애들만 수행하고 싶다.. 라면 ? 

filter도 apply처럼 함수자체를 인자로 받을 수 있다. 

잘 보면 A값이 3보다 큰애가 없어서 아예 버려지고 

B랑 C값의 경우 하나는 크니까 살아있다. 

11. A 키워드의 data1끼리 서로 max min구하고 빼서 새로운 시리즈에 적용한 거다 

 

12. get_group 그룹으로 묶은 데이터로 가져오기 

시도별로 일단 groupby로 읽고 get_group하면 충남 키워드를 가진 애들만 새로운 시리즈로 만들어준다. 

len()하면 몇갠지 확인할 수 있다 

-- 예전에 잭과 콩나물 했을 때 len()몰라서 못 썼다 ㅋㅋㅋㅋ

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를 기준으로 묶어 합계를 구해 출력해보세요.
a = df.groupby("key").sum()
print(a)

# key와 data1을 기준으로 묶어 합계를 구해 출력해보세요.
b = df.groupby(["key", "data1"]).sum()
print(b)
DataFrame:
  key  data1  data2
0   A      1      4
1   B      2      4
2   C      3      6
3   A      1      0
4   B      2      6
5   C      3      1 

     data1  data2
key              
A        2      4
B        4     10
C        6      7
           data2
key data1       
A   1          4
B   2         10
C   3          7
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 각각의 최솟값, 중앙값, 최댓값을 출력하세요.
a = df.groupby("key").aggregate([min, np.median, max])
print(a)


# 데이터 프레임을 'key' 칼럼으로 묶고, data1의 최솟값, data2의 합계를 출력하세요.
b = df.groupby("key").aggregate({'data1':min, 'data2':np.sum})
print(b)
    data1            data2           
      min median max   min median max
key                                  
A       0    1.5   3     0    2.0   4
B       1    2.5   4     4    5.0   6
C       2    3.5   5     1    3.5   6
     data1  data2
key              
A        0      4
B        1     10
C        2      7
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_three(x):
    return x["data2"].mean() > 3
a = df.groupby("key").filter(filter_three)
print(a)


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

print("applying : ")
b = df.groupby("key").apply(lambda x : x.max() - x.min())
print(b)
filtering : 
  key  data1  data2
1   B      1      4
2   C      2      6
4   B      4      6
5   C      5      1
applying : 
     data1  data2
key              
A        3      4
B        3      2
C        3      5

 

반응형