import pandas as pd
기본 리스트 형으로 Series 생성
import pandas as pd
sr = pd.Series([1000, 2000, 3000, 4000],index=["제로 콜라", "콜라", "사이다", "진저비어"])
print(sr)
출력 결과
제로 콜라 1000
콜라 2000
사이다 3000
진저비어 4000
dtype: int64
또한 인덱스 값 없이 사용할 수도 있는데 이 경우 기본 숫자로 배열된다
import pandas as pd
sr = pd.Series([1000, 2000, 3000, 4000], name = "Example")
print(sr)
출력 결과
0 1000
1 2000
2 3000
3 4000
Name: Example, dtype: int64
당연하게도 한가지 인덱스에 대한 값을 뽑아 올 수도 있다.
import pandas as pd
sr = pd.Series([1000, 2000, 3000, 4000],index=["제로 콜라", "콜라", "사이다", "진저비어"])
print(sr['사이다'])
출력 결과
3000
이렇게 만들어진 컬럼의 이름을 name으로 정할 수 있다.
import pandas as pd
sr = pd.Series([1000, 2000, 3000, 4000],index=["제로 콜라", "콜라", "사이다", "진저비어"],
name = "Example")
print(sr)
출력 결과
제로 콜라 1000
콜라 2000
사이다 3000
진저비어 4000
Name: Example, dtype: int64
값을 바꿔줄 수 도 있다.
sr = pd.Series([1000, 2000, 3000, 4000],index=["제로 콜라", "콜라", "사이다", "진저비어"])
sr['제로 콜라'] = 5000
print(sr)
출력 결과
제로 콜라 5000
콜라 2000
사이다 3000
진저비어 4000
dtype: int64
슬라이싱 기능도 가능하다.
sr = pd.Series([1000, 2000, 3000, 4000],index=["제로 콜라", "콜라", "사이다", "진저비어"])
print(sr[0:2])
출력 결과
제로 콜라 1000
콜라 2000
dtype: int64
0번째 부터 2번째 이전까지 가져오게 된다.
딕셔너리 형으로 만들고 싶다면 [] 대신 {}로 만들어 주고 {인덱스:값} 으로 만들면 된다.
import pandas as pd
sr = pd.Series({"제로 콜라" : 1000,"콜라" : 2000,"사이다": 3000,"진저비어" : 4000})
print(sr)
출력 결과
제로 콜라 1000
콜라 2000
사이다 3000
진저비어 4000
dtype: int64
기본 DataFrame 생성 방법
인덱스, 열, 값을 가진 2차원 데이터가 만들어진다.
index 가 행, columns가 열
import pandas as pd
values = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
index = ['1행', '2행', '3행']
columns = ['1열', '2열', '3열']
df = pd.DataFrame(values, index=index, columns=columns)
print(df)
출력 결과
1열 2열 3열 1행 1 2 3 2행 4 5 6 3행 7 8 9
물론 값 열등에 대한 각각의 출력도 가능하다.
import pandas as pd
values = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
index = ['1행', '2행', '3행']
columns = ['1열', '2열', '3열']
df = pd.DataFrame(values, index=index, columns=columns)
print("값 : \n", df.values)
print("인덱스(행): ", df.index)
print("열 : ", df.columns)
출력 결과
값 : [[1 2 3] [4 5 6] [7 8 9]] 인덱스(행): Index(['1행', '2행', '3행'], dtype='object') 열 : Index(['1열', '2열', '3열'], dtype='object')
DataFrame 역시 리스트형 외에 딕셔너리로도 가능하다.
import pandas as pd
data = {
'1열' : [1, 2, 3],
'2열' : [4, 5, 6],
'3열' : [7, 8, 9]
}
index = ['1행','2행','3행']
df = pd.DataFrame(data, index=index)
print(df)
출력 결과
1열 2열 3열 1행 1 4 7 2행 2 5 8 3행 3 6 9
df.head() 을 사용하여 처음부터 어디까지의 행을 조회한다.
import pandas as pd
data = {
'1열' : [1, 2, 3],
'2열' : [4, 5, 6],
'3열' : [7, 8, 9]
}
index = ['1행','2행','3행']
df = pd.DataFrame(data, index=index)
print(df.head(2)) #<<변경된 부분
출력 결과
1열 2열 3열 1행 1 4 7 2행 2 5 8
df.tail() 을 사용하면 위와 반대로 역순으로 행을 조회한다.
import pandas as pd
data = {
'1열' : [1, 2, 3],
'2열' : [4, 5, 6],
'3열' : [7, 8, 9]
}
index = ['1행','2행','3행']
df = pd.DataFrame(data, index=index)
print(df.tail(2)) #<<변경된 부분
출력 결과
1열 2열 3열 2행 2 5 8 3행 3 6 9
df['열 명칭']을 통해 특정 열만 정해서 조회할 수 있다.
import pandas as pd
data = {
'1열' : [1, 2, 3],
'2열' : [4, 5, 6],
'3열' : [7, 8, 9]
}
index = ['1행','2행','3행']
df = pd.DataFrame(data, index=index)
print(df['2열'])
출력 결과
1행 4 2행 5 3행 6 Name: 2열, dtype: int64
여기서 loc의 기능을 통해 열의 특정값을 조회 할 수도있다.
import pandas as pd
data = {
'1열' : [1, 2, 3],
'2열' : [4, 5, 6],
'3열' : [7, 8, 9]
}
df = pd.DataFrame(data)
print(df.loc[1,'2열'])
출력 결과
5
마찬가지로 행에 대해서도 조회가 가능하다.
import pandas as pd
data = {
'1열' : [1, 2, 3],
'2열' : [4, 5, 6],
'3열' : [7, 8, 9]
}
index = ['1행','2행','3행']
df = pd.DataFrame(data, index=index)
print(df.loc['2행'])
출력 결과
1열 2
2열 5
3열 8
Name: 2행, dtype: int64
이걸 iloc를 이용한 암시적으로 조회 해보자
import pandas as pd
data = {
'1열' : [1, 2, 3],
'2열' : [4, 5, 6],
'3열' : [7, 8, 9]
}
index = ['1행','2행','3행']
df = pd.DataFrame(data, index=index)
print(df.iloc[1])
출력 결과
1열 2
2열 5
3열 8
Name: 2행, dtype: int64
암시적으로 접근시 0이 1번째임을 늘 기억하자
이때 loc를 쓸지 iloc 을 사용 할지 정할 수 있는데. 행의 이나 열의 이름을 내가 정해 줬다면 보기 좋게 loc(명시적 접근)을 사용하자.
ex)
내가 행이나 열에 이름을 정한경우 (loc)print(df.loc[1,'2열'])
내가 행이나 열에 이름을 정하지 않아 숫자로 행열이 자동으로 생성된 경우 (iloc)print(df.iloc[1])
물론 암시적 접근도 가능은하나 1번째가 0으로 카운터 되서 덜 직관적이다.
그 중 csv파일을 예로 들어 보자.
CSV란?
csv는 필드를 쉼표(,)로 구분한 텍스트 파일이다.
쉼표로 구분되어 있는 데이터 형식을 csv 파일 형식이라고 부르며,
확장자 명이 .csv라고 되어있으면 csv 파일이라고 한다.
CSV파일의 예
파일 저장하기
df.to_csv("c:/tmp/courses.csv")
#" " 안에 경로와 파일명이 저장된다. c:/asd/asd/(경로)qwdqe(파일 이름).csv(파일 확장자 명칭)
인덱스를 무시하고 저장하기
위 의 방식으로 저장하면 가장 앞열에 번호가 매겨지는 인덱스 열이 하나 생기게 된다. 따라서 이값을 false로 하면 앞에 불필요한 열이 생성되지 않는다. (기본이 ture이므로 어지간하면 적어주자.)!
df.to_csv("c:/tmp/courses.csv", index=False)
파일 가져오기
read_csv로 읽어오면 된다.
이때 csv 파일을 자동으로 데이터 프레임 구조로 바꿔준다.
import pandas as pd
df = pd.read_csv('test.csv') #test에는 해당 파일명을 적어주면 된다. df는 담고싶은 이름이면 된다.
이제 이걸 가져 와서 출력할 때는
print(df)#df=담았던 변수명칭
으로 간단하게 볼 수있다.
행(가로) 길이 파악
len(df)
len(df): 데이터프레임의 행의 수를 반환합니다. Python의 내장 함수입니다.
테이블 확인
display(df, df2, df3)
display(): 데이터프레임을 시각적으로 출력해주는 함수. Jupyter Notebook 환경에서 사용되며 여러 테이블을 동시에 출력할 수 있습니다.
테이블의 행과 열 갯수 확인
df.shape
df.shape: 데이터프레임의 행과 열의 수를 튜플로 반환합니다. (행 수, 열 수) 형식으로 출력됩니다.
컬럼 타입 확인
df.dtypes
df.dtypes: 각 컬럼의 데이터 타입을 확인할 수 있습니다. 예를 들어 int, float, object 등이 있습니다.
컬럼명 확인
df.columns
df.columns: 데이터프레임의 컬럼명을 인덱스 객체로 반환합니다.
데이터 배열 형태로 확인
df.values
df.values: 데이터프레임의 값을 numpy 배열 형태로 반환합니다.
테이블 기본 구조 확인
df.info()
df.info(): 데이터프레임의 간단한 요약 정보를 출력합니다. 각 컬럼의 데이터 타입, 결측치 개수, 메모리 사용량 등을 확인할 수 있습니다.
기본 통계 요약 확인
df2.describe()
df.describe(): 수치형 데이터의 통계적 요약을 제공합니다. 평균, 표준편차, 최소값, 사분위수, 최대값 등을 반환합니다.
결측치 확인
df.isnull().sum()
df.isnull(): 각 데이터가 결측치(NaN)인지 여부를 Boolean 값으로 반환합니다.
sum(): 컬럼별로 결측치 개수를 합산합니다.
특정 컬럼 가져오기
df.Category
df['Category']
df.iloc[:, 4]
df.Category: 데이터프레임의 컬럼을 속성으로 접근하는 방법. 다만, 컬럼명이 공백 또는 특수문자가 포함되면 이 방법을 사용할 수 없습니다.
df['Category']: 대괄호 연산자를 사용하여 컬럼을 가져오는 방법.
df.iloc[:, 4]: 인덱스를 기반으로 컬럼을 선택하는 방법. iloc은 행과 열을 인덱스 번호로 선택할 수 있습니다.
특정 컬럼 여러 개 가져오기
df[['Category', 'Selling Price']]
df.iloc[:, [4, 7]]
df[['Category', 'Selling Price']]: 여러 컬럼을 대괄호 안에 리스트로 넣어 선택합니다.
df.iloc[:, [4, 7]]: 여러 컬럼을 인덱스 번호로 선택합니다.
특정 컬럼 삭제
df3.drop('Interaction type', axis=1, inplace=True)
df.drop(): 지정된 컬럼이나 행을 삭제하는 함수. axis=1은 컬럼을 기준으로, inplace=True는 원본 데이터프레임에서 직접 변경한다는 의미입니다.
조건에 부합하는 데이터 가져오기
df2.where(df2['Age'] > 50)
df.where(): 주어진 조건을 만족하는 행은 원래 값을 유지하고, 만족하지 않는 행은 NaN으로 반환합니다.
조건에 부합하는 데이터 슬라이싱
mask = ((df2['Age'] > 50) & (df2['Gender'] == 'Male'))
df2[mask]
df2[mask]: 조건을 만족하는 데이터만 필터링하여 반환합니다. mask는 조건을 정의한 불리언 배열입니다.
데이터 그룹핑
df2.groupby('Gender')['Customer ID'].count()
df2.groupby(['Gender', 'Location'])['Customer ID'].count()
df.groupby(): 특정 컬럼을 기준으로 데이터를 그룹화합니다. 여러 기준으로도 그룹화할 수 있습니다.
count(): 그룹화된 데이터의 행 수를 반환합니다.
데이터의 중복 제거
df2.groupby('Location')['Age'].nunique()
nunique(): 중복을 제거한 고유한 값의 개수를 반환합니다. count()는 단순히 행의 수를 반환하고, nunique()는 고유한 값의 수를 반환하는 차이가 있습니다.