pandas DataFrame 데이터프레임

분류없음|2019.08.09 13:55

numpy는 1개의 데이터 타입을 갖지만

데이터 프레임은 시리즈의 집합이고 시리즈는 각각 데이터 타입을 갖을 수 있다.

 

데이터프레임 DataFrame - 시리즈를 모아서 데이터 테이블을 생성 기본적으로 2차원 데이터

 

판다스를 임포트하고 DataFrame()을 이용해 생성한다.

 

from pandas import Series, DataFrame

df = DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)

from pandas import DataFrame
data = {"name":["kim","lee","oh","jung","roh"],
       "age":["21","25","33","17","45"],
       "city":["seoul","daejeon","daegu","busan","gwangju"]}
column_list=["name","age","city"]
df = DataFrame(data, columns=column_list)
df
	name	age	city
0	kim	21	seoul
1	lee	25	daejeon
2	oh	33	daegu
3	jung	17	busan
4	roh	45	gwangju

보통 csv파일을 로드하여 사용하며 위와 같은 방식으로는 잘 사용하지 않는다.

일반적으로 대량의 데이터를 사용하기 때문에 직접 쓰지 않고 csv로 저장하였다가 불러와 사용

 

columns 인자에 키의 순서를 리스트로 넘기면 해당 키값의 순서대로 데이터가 나열되며

데이터에 없는 키가 전달되면 NaN으로 채운다.

column_list=["age","city","name","job"]
df = DataFrame(data, columns=column_list)
df
	age	city	name	job
0	21	seoul	kim	NaN
1	25	daejeon	lee	NaN
2	33	daegu	oh	NaN
3	17	busan	jung	NaN
4	45	gwangju	roh	NaN

df["column_name"]

column 값으로 시리즈 데이터를 선택할 수 있다.

city라는 하나의 시리즈 데이터를 선택하려면 딕셔너리 같이 column명으로 접근

df["city"]
0      seoul
1    daejeon
2      daegu
3      busan
4    gwangju
Name: city, dtype: object

df.column_name

df.column_name 으로도 시리즈 데이터를 선택할 수 있다.

df.name
0     kim
1     lee
2      oh
3    jung
4     roh
Name: name, dtype: object

하나의 로우row를 선택하려면 df[0]과 같이 생각할 수 있지만 이렇게 쓰면 오류가 발생한다.

df[0]
KeyError: 0

df.loc[index] 를 사용하여 해당 인덱스의 row를 추출

df.loc[0]
age        21
city    seoul
name      kim
job       NaN
Name: 0, dtype: object

만일 인덱스를 지정해줬다면 loc에 인덱스 이름이 들어가야 한다.

인덱스를 지정하지 않았을 경우 자동으로 0부터 숫자로 초기화 되지만

인덱스를 지정했다면 지정한 이름으로 접근해야 한다.

data = {"name":["kim","lee","oh","jung","roh"],
       "age":["21","25","33","17","45"],
       "city":["seoul","daejeon","daegu","busan","gwangju"]}
column_list=["name","age","city"]
df = DataFrame(data, columns=column_list, index=["a","b","c","d","e"])
df
	name	age	city
a	kim	21	seoul
b	lee	25	daejeon
c	oh	33	daegu
d	jung	17	busan
e	roh	45	gwangju
df.loc[0]
TypeError: cannot do label indexing on <class 'pandas.core.indexes.base.Index'> with these indexers [0] of <class 'int'>
df.loc["b"]
name        lee
age          25
city    daejeon
Name: b, dtype: object

df.iloc[시작번호:끝번호+1]인덱스의 이름이 아닌 인덱스의 순서로 접근

df.iloc[2:4]
	name	age	city
c	oh	33	daegu
d	jung	17	busan

df.loc["b"]는 인덱스가 b인 row 선택

df.iloc[2:4]는 2번째부터 3번째까지 row 선택

 

column에 데이터 할당

df.column명 = 시리즈 데이터

job_series = Series(["chef","officer","doctor","student","farmer"])
df.job = job_series
df
	age	city	name	job
0	21	seoul	kim	chef
1	25	daejeon	lee	officer
2	33	daegu	oh	doctor
3	17	busan	jung	student
4	45	gwangju	roh	farmer

df.T transpose 행과 열을 바꿈

df.T
	0	1	2	3	4
age	21	25	33	17	45
city	seoul	daejeon	daegu	busan	gwangju
name	kim	lee	oh	jung	roh
job	chef	officer	doctor	student	farmer

df.values 넘파이 배열로 변환

df.values
	0	1	2	3	4
age	21	25	33	17	45
city	seoul	daejeon	daegu	busan	gwangju
name	kim	lee	oh	jung	roh
job	chef	officer	doctor	student	farmer

df.to_csv("filename.csv") csv 파일로 저장하기

df.to_csv("filename.csv")

 

댓글()