본문 바로가기

Python/공부공부

[python] pandas (Series, DataFrame)

 

pandas

파이썬에서 데이터 분석/처리를 위한 라이브러리로, 엑셀, DB 테이블과 같은 구조적 데이터를 다루기 최적화.

* 기본구조
 - Series (1차원)
 - DataFrame(2차원) 


Series (1차원 데이터)

리스트나 배열을 pandas 형식으로 감싼 형태로, 인덱스(index)값(value)으로 구성

import pandas as pd

# 리스트 -> Series 변환
data = [10, 20, 30, 40]
s = pd.Series(data)

print(s)

(출력결과)

0    10
1    20
2    30
3    40
dtype: int64

=> 기본 index 자동 지정.


* 인덱스 지정

s = pd.Series([10, 20, 30], index=["a", "b", "c"])
print(s)

(출력결과)

a    10
b    20
c    30
dtype: int64

( key–value 형태로 데이터 추출 가능)

print(s["a"])   # 10
print(s["c"])   # 30

* 기본 연산

s = pd.Series([10, 20, 30])

print(s + 5)      # 모든 값에 5 더하기

(출력결과)

0    15
1    25
2    35
dtype: int64

* 통계 함수

s = pd.Series([10, 20, 30])

# 평균값
print(s.mean())   # 20.0

# 최대값
print(s.max())    # 30

 


 

DataFrame (2차원 데이터 - 행 X 열)

엑셀 시트, SQL 테이블 같은 형태.
내부적으로는 여러 개의 Series가 모여서 만든 구조.

import pandas as pd

data = {
    "name": ["A", "B", "C"],
    "age": [23, 25, 21],
    "score": [85, 90, 95]
}
df = pd.DataFrame(data)

print(df)

(출력결과)

  name  age  score
0    A   23     85
1    B   25     90
2    C   21     95

 


* 인덱스 지정

df = pd.DataFrame(data, index=["x", "y", "z"])
print(df)

(출력결과)

  name  age  score
x    A   23     85
y    B   25     90
z    C   21     95

 


* 열(column) 접근

print(df["age"])        	# 특정 열 접근 → Series

(출력결과)

   age
x   23
y   25
z   21

print(df[["name","score"]])  # 여러 열 접근 → DataFrame

(출력결과)

  name  score
x    A     85
y    B     90
z    C     95

 

 


* 행(row) 접근

print(df.loc["y"])   # 인덱스명으로 접근

(출력결과)

name      B
age      25
score    90
Name: y, dtype: object

print(df.iloc[1])    # 행 번호로 접근

(출력결과)

name      B
age      25
score    90
Name: y, dtype: object

 


* 통계 함수

# 평균 점수
print(df["score"].mean())   # 90.0

# 나이 최댓값
print(df["age"].max())      # 25

# 기초 통계 요약
print(df.describe())

(출력결과)

        age  score
count   3.0    3.0
mean   23.0   90.0
std     2.0    5.0
min    21.0   85.0
25%    22.0   87.5
50%    23.0   90.0
75%    24.0   92.5
max    25.0   95.0

 


 

활용

 

import pandas as pd

data = {
    "name": ["A", "B", "C", "D", "E", "F"],
    "score": [90, 85, 90, 95, 85, 90]
}
df = pd.DataFrame(data)
print(df)

(출력결과)

  name  score
0    A     90
1    B     85
2    C     90
3    D     95
4    E     85
5    F     90

 


(1) score별 이름 갯수 ( group by + count )

result = df.groupby("score")["name"].count()
print(result)

(출력결과)

score
85    2
90    3
95    1
Name: name, dtype: int64

 

(2)  score별 이름 갯수 (value_counts)

print(df["score"].value_counts())

 (출력결과)

90    3
85    2
95    1
Name: score, dtype: int64

 

(3) score별 이름 리스트

result = df.groupby("score")["name"].apply(list)
print(result)

or

result = df.groupby("score").agg({"name": list})
print(result)

 

(출력결과)

score
85       [B, E]
90    [A, C, F]
95          [D]
Name: name, dtype: object

 

(4) score갯수를 조건으로 이름 리스트 출력 ( group by + filter )

result = df.groupby("score").filter(lambda x: len(x) > 2)
print(result)

(출력결과)

  name  score
0    A     90
1    B     85
2    C     90
4    E     85
5    F     90

 

(5)score갯수를 조건으로 이름 리스트 출력 ( value_counts )

counts = df["score"].value_counts()
result = df[df["score"].isin(counts[counts >= 2].index)]
print(result)

(출력결과)

  name  score
0    A     90
1    B     85
2    C     90
4    E     85
5    F     90

 

(6)score갯수를 조건으로 이름 리스트 출력 ( groupby + apply )

result = df.groupby("score")["name"].apply(list)
result = result[result.apply(len) >= 2]
print(result)

(출력결과)

score
85       [B, E]
90    [A, C, F]
Name: name, dtype: object

 


 

* 위의 name들을 통합하여 리스트로 추출하기

(1) extend

result = df.groupby("score")["name"].apply(list)
result = result[result.apply(len) >= 2]

name_list = []
for names in result:
    name_list.extend(names)

print(name_list)	# ['B', 'E', 'A', 'C', 'F']

 

(2) List Comprension

result = df.groupby("score")["name"].apply(list)
result = result[result.apply(len) >= 2]

name_list = [n for names in result for n in names]

print(name_list)	# ['B', 'E', 'A', 'C', 'F']

 

(3) itertools.chain

result = df.groupby("score")["name"].apply(list)
result = result[result.apply(len) >= 2]

name_list = list(chain.from_iterable(result))

print(name_list)	# ['B', 'E', 'A', 'C', 'F']

 


 

Pandas 관련 참고

https://digital-play.tistory.com/31

 

파이썬 Pandas를 알기 위해서는 Series부터 이해하자.

파이썬 Pandas를 다루기 전에 오늘은 Pandas의 기본이 되는 Pandas Series에 대해서 알아봅시다. Pandas Series는 인덱싱된 데이터의 1 차원 배열입니다. Numpy(Numerical Python)와 다른 점은 Numpy는 명시적 인덱스

digital-play.tistory.com