<jupyter_start><jupyter_text>Pandas5. Pandas 자료구조의 연산6. 데이터 합치고 분리하기7. group_by<jupyter_code># 라이브러리 불러오기
import pandas as pd
import numpy as np<jupyter_output><empty_output><jupyter_text>5. Pandas 자료구조의 연산 시리즈와 데이터프레임의 연산  시리즈의 연산<jupyter_code>s1 = pd.Series(range(1, 6), index = list("abcde"))
s1
s2 = pd.Series(range(6, 11), index = list("bcdef"))
s2
# 참고
list("abcde")
s1 + s2<jupyter_output><empty_output><jupyter_text>시리즈의 연산은 인덱스가 같은 것끼리 계산하며, 인덱스가 없을 경우에는 NaN이 반환됨  데이터프레임의 연산<jupyter_code>df1 = pd.DataFrame(np.arange(12.).reshape((3, 4)), 
                   columns = list("abcd"))
df1
df2 = pd.DataFrame(np.arange(20.).reshape((4, 5)), 
                   columns = list("abcde"))
df2
df1 + df2<jupyter_output><empty_output><jupyter_text>데이터프레임의 연산도 시리즈와 마찬가지로 인덱스가 같은 것끼리 계산하며, 인덱스가 없을 경우에는 NaN이 반환됨  시리즈 + 데이터프레임<jupyter_code>df1
s1
df1 + s1<jupyter_output><empty_output><jupyter_text>시리즈의 인덱스와 데이터프레임의 컬럼인덱스가 대응되어 더해지며, 없는 인덱스는 NaN으로 반환됨  집계함수- lambda- map- apply  lambda 함수- 한 줄로 함수를 표현하는 방법- 일시적으로 사용할 함수를 정의할 때 사용하며, map과 apply와 적용할 때 많이 쓰임- 사용방법```pythonlambda 인자: 함수식```<jupyter_code># 일반적인 함수
def f1(x, y):
    return x + y
f1(3, 5)
# lambda 함수
f2 = lambda x, y: x + y
f2(3, 5)<jupyter_output><empty_output><jupyter_text>map 함수- 함수와 리스트(또는 array, 시리즈)를 받아서 리스트의 원소마다 입력받은 함수를 적용- `함수`의 경우는 보통 lambda 함수를 많이 사용1. 리스트에 적용 : 다음과 같이 `map()`의 결과를 `list()`로 묶어야 값을 확인할 수 있음```pythonlist(map(함수, 리스트))```2. Series에 적용```python시리즈.map(함수)```<jupyter_code>a = [1, 2, 3, 4, 5]
f = lambda x: x ** 2
list(map(f, a))
# list()를 하지 않았을 경우
map(f, a)
a = [1, 2, 3]
b = [4, 5, 6]
f = lambda x, y: x + y
list(map(f, a, b))
# 시리즈에서는 다음곽 같이 사용 가능
s = pd.Series(range(1, 11))
s.map(lambda x: x ** 2)<jupyter_output><empty_output><jupyter_text>apply 함수- map은 한 원소마다 적용하는 반면, apply는 series 전체(column)에 적용- 즉, 데이터프레임의 column마다의 연산을 할 때 유용- 행마다의 연산을 하고 싶은 경우, `axis = 1` 옵션을 넣으면 가능- series를 입력받을 수 있음```python데이터프레임.apply(함수)```<jupyter_code>df = pd.DataFrame(np.arange(9).reshape(3, 3),
                  columns = ["col1","col2","col3"])
df
# 각 컬럼이 series이기 때문에, 각 컬럼마다의 합을 계산
df.apply(sum)
# column마다의 평균
df.apply(np.mean)
# 행마다의 평균
df.apply(np.mean, axis = 1)<jupyter_output><empty_output><jupyter_text>기타 Pandas 내장함수<jupyter_code># 앞의 5개 행만 보여줌
iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')
iris.head()
# 뒤에서 5개 행만 보여줌
iris.tail()
# 각 컬럼마다의 연속형 변수의 기초통계량을 보여줌
iris.describe()
# series의 중복을 제거한 값만 보여줌
iris.species.unique()
# 컬럼마다의 합
iris.sum()
# 컬럼마다의 평균
iris.mean()
# 컬럼마다 결측치 확인
iris.isnull()
# 컬럼마다 결측치 개수 확인
iris.isnull().sum()<jupyter_output><empty_output><jupyter_text>6. 데이터 합치기 merge 함수- 기준 열을 중심으로 데이터 연결- 따로 지정이 없으면, 이름이 같은 열은 모두 기준 열이 됨<jupyter_code>df1 = pd.DataFrame({
    '고객번호': [1001, 1002, 1003, 1004, 1005, 1006, 1007],
    '이름': ['둘리', '도우너', '또치', '길동', '희동', '마이콜', '영희']
})
df1
df2 = pd.DataFrame({
    '고객번호': [1001, 1001, 1005, 1006, 1008, 1001],
    '금액': [10000, 20000, 15000, 5000, 100000, 30000]
}, columns = ['고객번호', '금액'])
df2<jupyter_output><empty_output><jupyter_text>어떤 방식으로 붙일까?<jupyter_code># inner join
pd.merge(df1, df2)
# outer join
pd.merge(df1, df2, how = "outer")
# left join
pd.merge(df1, df2, how = "left")
# right join
pd.merge(df1, df2, how = "right")<jupyter_output><empty_output><jupyter_text>기준변수 지정<jupyter_code>df1 = pd.DataFrame({'고객번호': [1001, 1002, 1003, 1004, 1005, 1006, 1007],
                    '이름': ['둘리', '도우너', '또치', '길동', '희동', '마이콜', '영희'],
                    '금액': [100, 200, 300, 400, 500, 600, 700]})
df1
df2 = pd.DataFrame({'고객번호': [1001, 1001, 1005, 1006, 1008, 1001],    
                    '금액': [10000, 20000, 15000, 5000, 100000, 30000]})
df2
# 고객번호와 금액이 두 데이터에 모두 존재하기 때문에, 두개가 동시에 만족하는 데이터는 없음
pd.merge(df1, df2)
# 기준변수를 지정해주면 다음과 같이 나타남
pd.merge(df1, df2, on = "고객번호")<jupyter_output><empty_output><jupyter_text>concat 함수- 기준 열을 사용하지 않고 합칠 때 사용  행으로 붙이기- 행으로 붙이기 때문에, 인덱스가 중복됨<jupyter_code>l1 = [{'name': 'John', 'job': "teacher"},
      {'name': 'Nate', 'job': "student"},
      {'name': 'Jack', 'job': "developer"}]        
df1 = pd.DataFrame(l1, columns = ['name', 'job'])
df1
pd.concat([df1, df1])
# append도 같은 결과를 줌
df1.append(df1)<jupyter_output><empty_output><jupyter_text>열로 붙이기- 인덱스에 맞춰서 붙여줌<jupyter_code>l2 = [{'age': 25, 'country': "U.S"},
      {'age': 30, 'country': "U.K"},
      {'age': 45, 'country': "Korea"}]
df2 = pd.DataFrame(l2, columns = ['age', 'country'])
df2
# 열로 붙이기 위해서는 "axis = 1" 옵션이 필요
result = pd.concat([df1, df2], axis = 1)
result<jupyter_output><empty_output><jupyter_text>7. 그룹별 연산- 그룹을 지어 그룹마다의 계산을 하고 싶을 때 사용```pythongroupby```<jupyter_code>df2 = pd.DataFrame({
    'key1': ['<KEY>'],
    'key2': ['one', 'two', 'one', 'two', 'one'],
    'data1': [1, 2, 3, 4, 5],
    'data2': [10, 20, 30, 40, 50]
})
df2
df2.key1<jupyter_output><empty_output><jupyter_text>key1의 그룹별로 합을 구하고 싶을 때?<jupyter_code>df2.groupby(df2.key1).sum()<jupyter_output><empty_output><jupyter_text>key1과 key2별로 합을 구하고 싶을 때?<jupyter_code>df2.groupby(["key1","key2"]).sum()<jupyter_output><empty_output><jupyter_text>key1별로 합, 평균, 표준편차를 알고 싶을 때? `agg()`<jupyter_code>df2.groupby(df2.key1).agg([np.sum, np.mean, np.std])<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.17716383307573416, 'fraction_numerical': 0.06452859350850078, 'mean_word_length': 4.426624737945493, 'pattern_counts': {'":': 0, '<': 70, '<?xml version=': 0, '>': 70, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '17', 'dir': 'jupyter-structured-clean-dedup', 'id': '618470', 'license': 'MIT', 'n_tokens_mistral': 3335, 'n_tokens_neox': 3679, 'n_words': 586, 'path': 'Lecture_note/Day3/Pandas_2.ipynb', 'repo_name': 'statKim/stats-summer-2021', 'size': '5192'}