안경잡이개발자

728x90
반응형

※ Data Frame의 마스킹 ※


  Pandas의 Data Frame 라이브러리는 Numpy처럼 마스킹 연산이 가능합니다.


import numpy as np
import pandas as pd

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


※ 함수로 데이터 변경하기 ※


  apply()라는 함수를 이용하면 특정한 함수를 공통적으로 적용할 수 있습니다.


import numpy as np
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)
df = df.apply(lambda x: x + 1)
print(df)

def addOne(x):
    return x + 1

df = df.apply(addOne)
print(df)


  또한 replace() 함수도 원소의 값을 바꿀 때 매우 많이 사용됩니다.


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)


※ 데이터 그룹화 ※


  Pandas는 데이터를 그룹화할 수 있도록 groupby() 함수를 제공하고 있습니다.


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)
print(df.groupby(['Type']).sum())


  더불어 aggregate() 함수를 이용하면 보다 자유자재로 그룹화를 다룰 수 있습니다.


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)
print(df.groupby(["Type"]).aggregate([min, max, np.average]))


  그룹에 대한 필터링(Filtering)을 걸고자 한다면 다음과 같이 filter() 함수를 이용할 수 있습니다. 저는 빈도수(Frequency) 평균이 5 이상인 타입(Type)만 추출하도록 소스코드를 작성해보았습니다.


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

df = df.groupby("Type").filter(my_filter)
print(df)


  또한 가장 단순한 형태의 필터링은 다음과 같이 임의의 속성으로 데이터를 추출하는 것입니다.


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 = df.groupby("Type").get_group("Fruit")
print(df)


  더불어 apply() 함수를 이용해 임의의 함수를 적용할 수도 있습니다. 저는 각 데이터가 평균 값에 비해서 어느 정도 격차가 나오는지 그룹별로 확인해보는 소스코드를 작성했습니다.


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)


※ 다중화 ※


  Pandas에서는 데이터를 다중화할 수도 있습니다. 인덱스를 여러 개로 구성하는 방법은 다음과 같습니다. 열 또한 마찬가지의 방법을 이용해서 다중 인덱스를 구성할 수 있습니다.


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차"])


※ 피벗 테이블 ※


  피벗 테이블(Pivot Table)은 흔히 엑셀에서 표 데이터를 재구성할 때 사용하는 기능입니다. Pandas는 이러한 피벗 테이블 기능을 제공합니다. 저는 기존의 데이터에서 인덱스로 'Importance'를, 열로 'Type'을 두고 빈도수를 출력하는 프로그램을 작성하고자 합니다. 동일한 Importance 값이 있다면 가장 큰 빈도수가 출력되도록 합니다.


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"])

df = df.pivot_table(
    index="Importance", columns="Type", values="Frequency",
    aggfunc=np.max
)
print(df)



728x90
반응형

728x90
반응형

  판다스(Pandas)는 파이썬(Python) 라이브러리 중 하나로서 데이터를 효과적으로 처리하고 보여줄 수 있도록 도와줍니다. 또한 Numpy와 함께 사용되어 다양한 연계 기능을 제공합니다. 판다스의 기본 자료형 중 하나로는 시리즈(Series)가 있습니다. 이는 Numpy 배열과 흡사하지만 인덱스(Index)를 제공한다는 점에서 사전(Dictionary) 자료형에 가깝습니다. 이를 이용해 인덱스로 특정한 데이터에 바로 접근할 수 있습니다.


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


  사전과 흡사하게 동작한다는 점에서 파이썬(Python)의 사전(Dictionary)를 판다스 객체로 만들 수 있습니다.


import pandas as pd

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

array = pd.Series(dict)
print(array['a'])


※ 데이터 프레임(Data Frame) ※


  데이터 프레임은 Pandas에서 다수의 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)

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

print(summary)


  또한 Pandas도 Numpy와 마찬가지로 연산이 가능합니다.


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)


  이러한 판다스 객체는 인덱스를 기준으로 처리하고, 슬라이싱 하는 등의 작업을 수행할 수 있습니다. 슬라이싱을 할 때는 iloc 혹은 loc를 사용할 수 있습니다. iloc는 인덱스를 기준으로 슬라이싱을 처리하도록 도와줍니다.


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:])


  같은 문법을 활용하여 특정한 데이터를 수정하거나 삽입할 수도 있습니다.


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
})

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


※ Pandas를 이용해 엑셀(Excel)로 내보내기/불러오기 ※


  판다스의 내장 함수를 이용하면 엑셀 파일 형태로 내보내거나 불러올 수도 있습니다.


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)


728x90
반응형