본문 바로가기
Data Analysis/Data Analysis & Image Processing

15. Pandas

by SeleniumBindingProtein 2022. 4. 16.
728x90
반응형

Pandas 기본 사용법

# 판다스(Pandas): 데이터를 효과적으로 처리하고, 보여줄 수 있도록 도와주는 라이브러리입니다.
# Numpy와 함께 사용되어 다양한 연계적인 기능을 제공합니다.
# 인덱스(Index)에 따라 데이터를 나열하므로 사전(Dictionary) 자료형에 가깝습니다.
# 시리즈(Series)를 기본적인 자료형으로 사용합니다.
# 시리즈(Series): 시리즈는 인덱스와 값으로 구성됩니다.

import pandas as pd

array = pd.Series(['사과', '바나나', '당근'], index=['a', 'b', 'c'])

print(array)
print(array['a'])
a     사과
b    바나나
c     당근
dtype: object
사과

import pandas as pd

data = {
    'a': '사과',
    'b': '바나나',
    'c': '당근'
}

# Dict 자료형을 Series로 바꾸기
array = pd.Series(data)
print(array['a'])
사과

# 데이터 프레임
# 다수의 시리즈(Series)를 모아 처리하기 위한 목적으로 사용합니다.
# 표 형태로 데이터를 손쉽게 출력하고자 할 때 사용할 수 있습니다.

import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)

# 이름(Name): 값(Values)
summary = pd.DataFrame({
    'word': word,
    'frequency': frequency
})

print(summary)
       word  frequency
Apple    사과          3
Banana  바나나          5
Carrot   당근          7

 
# 시리즈의 연산
# 시리즈를 서로 연산하여 새로운 시리즈를 만들 수 있습니다.

import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7
}

importance_dict = {
    'Apple': 3,
    'Banana': 2,
    'Carrot': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})

score = summary['frequency'] * summary['importance']
summary['score'] = score

print(summary)
       word  frequency  importance  score
Apple    사과          3           3      9
Banana  바나나          5           2     10
Carrot   당근          7           1      7

 
#데이터 프레임의 슬라이싱 

import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근',
    'Durian': '두리안'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7,
    'Durian': 2
}

importance_dict = {
    'Apple': 3,
    'Banana': 2,
    'Carrot': 1,
    'Durian': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})

print(summary)

# 이름을 기준으로 슬라이싱
print(summary.loc['Banana':'Carrot', 'importance':])

# 인덱스를 기준으로 슬라이싱
print(summary.iloc[1:3, 2:])
print(summary.iloc[0:2, 0:2])
       word  frequency  importance
Apple    사과          3           3
Banana  바나나          5           2
Carrot   당근          7           1
Durian  두리안          2           1
        importance
Banana           2
Carrot           1
        importance
Banana           2
Carrot           1
       word  frequency
Apple    사과          3
Banana  바나나          5

 
#데이터 프레임의 연산

import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근',
    'Durian': '두리안'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7,
    'Durian': 2
}

importance_dict = {
    'Apple': 3,
    'Banana': 2,
    'Carrot': 1,
    'Durian': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})

print(summary)

summary.loc['Apple', 'importance'] = 5 # 데이터의 변경
summary.loc['Elderberry'] = ['엘더베리', 5, 3] # 새 데이터 삽입

print(summary)
       word  frequency  importance
Apple    사과          3           3
Banana  바나나          5           2
Carrot   당근          7           1
Durian  두리안          2           1
            word  frequency  importance
Apple         사과          3           5
Banana       바나나          5           2
Carrot        당근          7           1
Durian       두리안          2           1
Elderberry  엘더베리          5           3

#엑셀로 내보내기/불러오기

import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency
})

summary.to_csv("summary.csv", encoding="utf-8-sig")
saved = pd.read_csv("summary.csv", index_col=0)
print(saved)
       word  frequency
Apple    사과          3
Banana  바나나          5
Carrot   당근          7

#데이터 프레임 자료형의 연산 

import pandas as pd

array1 = pd.DataFrame([[1, 2], [3, 4]], index=['A', 'B'])
array2 = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], index=['B', 'C', 'D'])

print(array1)
print(array2)

array = array1.add(array2, fill_value=0)
print(array)
   0  1
A  1  2
B  3  4
   0  1  2
B  1  2  3
C  4  5  6
D  7  8  9
     0    1    2
A  1.0  2.0  NaN
B  4.0  6.0  3.0
C  4.0  5.0  6.0
D  7.0  8.0  9.0

 
# 데이터 프레임 집계 함수

import pandas as pd

array1 = pd.DataFrame([[1, 2], [3, 4]], index=['A', 'B'])
array2 = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], index=['B', 'C', 'D'])

array = array1.add(array2, fill_value=0)
print(array)
print("컬럼 1의 합:", array[1].sum())
print(array.sum())
     0    1    2
A  1.0  2.0  NaN
B  4.0  6.0  3.0
C  4.0  5.0  6.0
D  7.0  8.0  9.0
컬럼 1의 합: 21.0
0    16.0
1    21.0
2    18.0
dtype: float64

# 데이터 프레임 정렬 함수

import pandas as pd
import numpy as np

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근',
    'Durian': '두리안'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 1,
    'Durian': 2
}

importance_dict = {
    'Apple': 3,
    'Banana': 2,
    'Carrot': 1,
    'Durian': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})

print(summary)
# 객체를 값에 따라 정렬할 경우, sort_values 메서드 이용
# 내림차순으로 정렬할 때, ascending=False 로 지정
summary = summary.sort_values('frequency', ascending=False)
print(summary)
       word  frequency  importance
Apple    사과          3           3
Banana  바나나          5           2
Carrot   당근          1           1
Durian  두리안          2           1
       word  frequency  importance
Banana  바나나          5           2
Apple    사과          3           3
Durian  두리안          2           1
Carrot   당근          1            

Pandas 연산과 함수

# 데이터 프레임의 Null 여부 확인

import pandas as pd
import numpy as np

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근',
    'Durian': '두리안'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': np.nan,
    'Durian': 2
}

importance_dict = {
    'Apple': 3,
    'Banana': 2,
    'Carrot': 1,
    'Durian': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})

print(summary)
print(summary.notnull())
print(summary.isnull())
# dropna는 결측치 NaN를 제거하는 방법이고, fillna( )는 다른 데이터로 채우는 방법
summary['frequency'] = summary['frequency'].fillna('데이터 없음')
print(summary)
       word  frequency  importance
Apple    사과        3.0           3
Banana  바나나        5.0           2
Carrot   당근        NaN           1
Durian  두리안        2.0           1
        word  frequency  importance
Apple   True       True        True
Banana  True       True        True
Carrot  True      False        True
Durian  True       True        True
         word  frequency  importance
Apple   False      False       False
Banana  False      False       False
Carrot  False       True       False
Durian  False      False       False
       word frequency  importance
Apple    사과       3.0           3
Banana  바나나       5.0           2
Carrot   당근    데이터 없음           1
Durian  두리안       2.0           1

 
# 시리즈 자료형의 연산

import pandas as pd

array1 = pd.Series([1, 2, 3], index=['A', 'B', 'C'])
array2 = pd.Series([4, 5, 6], index=['B', 'C', 'D'])

# fill_value 옵션 : NaN 데이터를 입력값으로 적용후에 함수 적용
#add와 같은 산술연산함수를 적용할 때 fill_value 옵션을 적용하면 NaN이 발생할 경우 특정 값으로 대입할 수 있습니다.
array = array1.add(array2, fill_value=0)
print(array)
A    1.0
B    6.0
C    8.0
D    6.0
dtype: float64

 
#데이터 프레임 자료형의 연산 

import pandas as pd

array1 = pd.DataFrame([[1, 2], [3, 4]], index=['A', 'B'])
array2 = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], index=['B', 'C', 'D'])

print(array1)
print(array2)

array = array1.add(array2, fill_value=0)
print(array)
   0  1
A  1  2
B  3  4
   0  1  2
B  1  2  3
C  4  5  6
D  7  8  9
     0    1    2
A  1.0  2.0  NaN
B  4.0  6.0  3.0
C  4.0  5.0  6.0
D  7.0  8.0  9.0

# 데이터 프레임 집계 함수

import pandas as pd

array1 = pd.DataFrame([[1, 2], [3, 4]], index=['A', 'B'])
array2 = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], index=['B', 'C', 'D'])

array = array1.add(array2, fill_value=0)
print(array)
print("컬럼 1의 합:", array[1].sum())
print(array.sum())
     0    1    2
A  1.0  2.0  NaN
B  4.0  6.0  3.0
C  4.0  5.0  6.0
D  7.0  8.0  9.0
컬럼 1의 합: 21.0
0    16.0
1    21.0
2    18.0
dtype: float64

# 데이터 프레임 정렬 함수

import pandas as pd
import numpy as np

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근',
    'Durian': '두리안'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 1,
    'Durian': 2
}

importance_dict = {
    'Apple': 3,
    'Banana': 2,
    'Carrot': 1,
    'Durian': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})

print(summary)
# 객체를 값에 따라 정렬할 경우, sort_values 
# 내림차순으로 정렬할 때, ascending=False 로 지정
summary = summary.sort_values('frequency', ascending=False)
print(summary)
       word  frequency  importance
Apple    사과          3           3
Banana  바나나          5           2
Carrot   당근          1           1
Durian  두리안          2           1
       word  frequency  importance
Banana  바나나          5           2
Apple    사과          3           3
Durian  두리안          2           1
Carrot   당근          1           1

 
Pandas 활용
# 데이터 프레임의 마스킹


import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(1, 10, (3, 3)), index=[0, 1, 2], columns=["A", "B", "C"])
# 데이터 프레임 출력하기
print(df)
# 컬럼 A의 각 원소가 5보다 작거나 같은지 출력
print(df["A"] <= 5)
# 컬럼 A의 원소가 5보다 작고, 컬럼 B의 원소가 8보다 작은 행 추출
# query() : 조건 부합 데이터 추출 
print(df.query("A <= 5 and B <= 8"))

# 데이터 프레임의 개별 연산

import pandas as pd

df = pd.DataFrame([[1, 2, 3, 4], [1, 2, 3, 4]], index=[0, 1], columns=["A", "B", "C", "D"])
print(df)

# lambda란 함수를 한 줄로 표현하는 익명 함수 기법
df = df.apply(lambda x: x + 1)
print(df)

# def 함수이름(): # 첫 행
# 본문 # 함수를 호출했을 때, 실행할 코드 블록
def addOne(x):
  return x + 1
  
df = df.apply(addOne)
print(df)
   A  B  C  D
0  1  2  3  4
1  1  2  3  4
   A  B  C  D
0  2  3  4  5
1  2  3  4  5
   A  B  C  D
0  3  4  5  6
1  3  4  5  6

 
import pandas as pd

df = pd.DataFrame([
  ['Apple', 'Apple', 'Carrot', 'Banana'],
  ['Durian', 'Banana', 'Apple', 'Carrot']],
  index=[0, 1],
  columns=["A", "B", "C", "D"])

print(df)
df = df.replace({"Apple": "Airport"})
print(df)
        A       B       C       D
0   Apple   Apple  Carrot  Banana
1  Durian  Banana   Apple  Carrot
         A        B        C       D
0  Airport  Airport   Carrot  Banana
1   Durian   Banana  Airport  Carrot

 
# 데이터 프레임의 그룹화
import pandas as pd

df = pd.DataFrame([
  ['Apple', 7, 'Fruit'],
  ['Banana', 3, 'Fruit'],
  ['Beef', 5, 'Meal'],
  ['Kimchi', 4, 'Meal']],
  columns=["Name", "Frequency", "Type"])

print(df)
# groupby : 주어진 데이터를 그룹 별로 구분하여 데이터를 보기 위해 사용되는 함수이다.
print(df.groupby(['Type']).sum())
     Name  Frequency   Type
0   Apple          7  Fruit
1  Banana          3  Fruit
2    Beef          5   Meal
3  Kimchi          4   Meal
       Frequency
Type            
Fruit         10
Meal           9

import numpy as np
import pandas as pd

df = pd.DataFrame([
  ['Apple', 7, 5, 'Fruit'],
  ['Banana', 3, 6, 'Fruit'],
  ['Beef', 5, 2, 'Meal'],
  ['Kimchi', 4, 8, 'Meal']],
  columns=["Name", "Frequency", "Importance", "Type"])

print(df)
# aggregate : 내가 원하는 함수를 직접 만들어 사용하고, dataframe에 적용시킬 수 있음
print(df.groupby(["Type"]).aggregate([min, max, np.average]))

 

     Name  Frequency  Importance   Type
0   Apple          7           5  Fruit
1  Banana          3           6  Fruit
2    Beef          5           2   Meal
3  Kimchi          4           8   Meal
      Frequency             Importance            
            min max average        min max average
Type                                              
Fruit         3   7     5.0          5   6     5.5
Meal          4   5     4.5          2   8     5.0

import pandas as pd

df = pd.DataFrame([
  ['Apple', 7, 5, 'Fruit'],
  ['Banana', 3, 6, 'Fruit'],
  ['Beef', 5, 2, 'Meal'],
  ['Kimchi', 4, 8, 'Meal']],
  columns=["Name", "Frequency", "Importance", "Type"])


def my_filter(data):
  return data["Frequency"].mean() >= 5


print(df)
#group객체.filter(조건식 함수)로 사용하며, 개별원소에 대한 필터링이 아니라, group객체를 필터링 한다는 것
df = df.groupby("Type").filter(my_filter)
print(df)
     Name  Frequency  Importance   Type
0   Apple          7           5  Fruit
1  Banana          3           6  Fruit
2    Beef          5           2   Meal
3  Kimchi          4           8   Meal
     Name  Frequency  Importance   Type
0   Apple          7           5  Fruit
1  Banana          3           6  Fruit

import pandas as pd

df = pd.DataFrame([
  ['Apple', 7, 5, 'Fruit'],
  ['Banana', 3, 6, 'Fruit'],
  ['Beef', 5, 2, 'Meal'],
  ['Kimchi', 4, 8, 'Meal']],
  columns=["Name", "Frequency", "Importance", "Type"])
#get_group() 메서드로 특정 그룹만 가져오기
df = df.groupby("Type").get_group("Fruit")
print(df)
     Name  Frequency  Importance   Type
0   Apple          7           5  Fruit
1  Banana          3           6  Fruit

import pandas as pd

df = pd.DataFrame([
  ['Apple', 7, 5, 'Fruit'],
  ['Banana', 3, 6, 'Fruit'],
  ['Beef', 5, 2, 'Meal'],
  ['Kimchi', 4, 8, 'Meal']],
  columns=["Name", "Frequency", "Importance", "Type"])

df["Gap"] = df.groupby("Type")["Frequency"].apply(lambda x: x - x.mean())
print(df)
     Name  Frequency  Importance   Type  Gap
0   Apple          7           5  Fruit  2.0
1  Banana          3           6  Fruit -2.0
2    Beef          5           2   Meal  0.5
3  Kimchi          4           8   Meal -0.5

# 데이터 프레임의 다중화

import numpy as np
import pandas as pd

df = pd.DataFrame(
  np.random.randint(1, 10, (4, 4)),
  index=[['1차', '1차', '2차', '2차'], ['공격', '수비', '공격', '수비']],
  columns=['1회', '2회', '3회', '4회']
)

print(df)
print(df[["1회", "2회"]].loc["2차"])
       1회  2회  3회  4회
1차 공격   4   8   7   8
   수비   5   8   4   7
2차 공격   8   6   8   4
   수비   3   6   8   3
    1회  2회
공격   8   6
수비   3   6

# 피벗 테이블의 기초 

import numpy as np
import pandas as pd

df = pd.DataFrame([
    ['Apple', 7, 5, 'Fruit'],
    ['Banana', 3, 6, 'Fruit'],
    ['Coconut', 2, 6, 'Fruit'],
    ['Rice', 8, 2, 'Meal'],
    ['Beef', 5, 2, 'Meal'],
    ['Kimchi', 4, 8, 'Meal']],
   columns=["Name", "Frequency", "Importance", "Type"])

print(df)
# 피벗(Pivot) 테이블이란 많은 양의 데이터에서 필요한 자료만을 뽑아 새롭게 표를 작성해 주는 기능
# 피벗 테이블을 사용하면 사용자 임의대로 데이터를 정렬하고 필터링 할 수 있음
# tips.pivot(index=[행 인덱스], columns=[열 인덱스], values=[분석하고자 하는 KEY FIGURE(변수)])
# aggfunc 라는 옵션을 통해 해당 데이터의 통계량을 바로 계산하는 것이 가능하다
# aggfunc : 데이터 축약 시 사용할 함수 (mean, sum, count ...)

출처: https://data-make.tistory.com/135 [Data Makes Our Future]
df = df.pivot_table(
    index="Importance", columns="Type", values="Frequency",
    aggfunc=np.max
)
print(df)
      Name  Frequency  Importance   Type
0    Apple          7           5  Fruit
1   Banana          3           6  Fruit
2  Coconut          2           6  Fruit
3     Rice          8           2   Meal
4     Beef          5           2   Meal
5   Kimchi          4           8   Meal
Type        Fruit  Meal
Importance             
2             NaN   8.0
5             7.0   NaN
6             3.0   NaN
8             NaN   4.0
728x90
반응형

'Data Analysis > Data Analysis & Image Processing' 카테고리의 다른 글

17. 웹 크롤링  (0) 2022.04.16
16. Matplotlib  (0) 2022.04.16
14. KNN 숫자 인식 예제  (0) 2022.04.16
13. KNN Algorithm  (0) 2022.04.16
12. OpenCV Filtering  (0) 2022.04.16

댓글