import pandas as pd
df = pd.DataFrame({'Old A' : ['Old a1', 'Old a2', 'Old a3', 'Old a4'], 'Old B' : ['Old b1', 'Old b2', 'Old b3', 'Old b4'], 'Old C' : ['Old c1', 'Old c2', 'Old c3', 'Old c4']})
df

1. 인덱스 명 바꾸기

 

  • 1-1 df.index = ["바꿀 인덱스 값"]

# 모든 인덱스를 바꿀때만 

# 이미 생성된 컬럼수와 입력하는 컬럼수가 같아야함
df.index = ["New 0", "New 1", "New 2", "New 3"]
df

 

 

 

  • 1- 2 df.rename(columns = {"원래이름" : "바꿀이름" }, option)   

(일부의 인덱스명만 바꿀때 and 인덱스명으로)

 * rename의 파라미터인 딕셔너리 형태로 써줌

# 일부의 인덱스명만 바꿀때 and 인덱스명으로
df.rename(index = {0: "New 0", 1: "New 1"}) 
# df.rename({0: "New 0", 1: "New 1"}, axis =0)

# axis= 0 은 인덱스  (생략도 가능)

 

 

 

option : inplace = True (기존값도 변경)   

 

  • 1-3 df.index.values[컬럼번호] = "바꿀 컬럼명" 

(일부의 컬럼명만 바꿀때 and 컬럼명으로)

# 일부의 인덱스명만 바꿀때 and 인덱스 번호로
df.index.values[0] = "New A0"

 

 

 

오류발생 !!

# 'int' object has no attribute 'index'
# invalid literal for int() with base 10: 'New A0'

 

  • 1-4 컬렴을(열)을 인덱스로 만들기
df1 = df.set_index("Old A")
df1

 

 

 

2.  컬럼명 명 바꾸기

-> 인덱스랑 똑같다. 'Index 대신 'columns'로 바꾸면 끝

 

  • 1- 1  df.column 을 통해서 바꾸기  

(모든 컬럼명을 바꿔야 할때만)

* column 의 파라미터인 리스트형태로 써줌

df.columns = ["New A", "New B", "New C"] # 이미 생성된 컬럼수와 입력하는 컬럼수가 같아야함
df

 

 

  • 1- 2 df.rename(columns = {"원래이름" : "바꿀이름" }, option)   

(일부의 컬럼명만 바꿀때 and 컬럼명으로)

 * rename의 파라미터인 딕셔너리 형태로 써줌

# 일부의 컬럼명만 바꿀때 and 컬럼명으로
df.rename(columns = {"Old A": "New A1", "Old B": "New B1"}) 
# df.rename({"Old A": "New A1", "Old B": "New B1"}, axis =1)

# axis= 1 은 컬럼(열)

# rename() 함수에서는 lambda 사용가능
df.rename(columns= lambda x:'[' + x +']' )

 

option : inplace = True (기존값에 저장)   

 

  • 1-3 df.columns.values[컬럼번호] = "바꿀 컬럼명" 

(일부의 컬럼명만 바꿀때 and 컬럼명으로)

# 일부의 컬럼명만 바꿀때 and 컬럼 번호로
df.columns.values[0] = "New A1"

 

 

3.  데이터 값 변경

CRUD에서 R과 똑같음

https://itcreator.tistory.com/143

# https://itcreator.tistory.com/143    3-1번 

titan_df.loc[0,'Pclass']  # 3이 출력됐었음

# " = " 만 넣으면 끝
titan_df.loc[0,'Pclass'] = 999999  # 3에서 999999로 바뀜

 

 

4. 조건으로 데이터 값 변경하기 

- lamda

# st['default'] = st['default'].apply(lambda x : 0 if x == 'No' else 1)
# st

 

5. replace

df.replace('현재 문자열', '바꿀 문자열', inplace = True) # inplace = True : 원본도 바꿈


# 여러개 바꿀때는 Key-Value 형태로 가능 
df.replace({'현재 문자열1':'바꿀 문자열 1', '현재문자열2':' 바꿀 문자열 2'})


# 하나의 컬럼에서 바꿀때
df.replace({'컬럼이름': {'찾을 문자열': '대체 문자열'}}

DataFrame에서 데이터 추출

 

1. 추출용 데이터 셋 다운받기 

https://www.kaggle.com/competitions/titanic/data

에서 자료 다운받기 

 

# 데이터셋 불러오기

import pandas as pd
titan_df = pd.read_csv('./titanic/train.csv')
titan_df

 

 

2. 선택된 열(column) 세로만 뽑아보기

# 선택된 열(column) 세로만 뽑아보기

titan_df[['Name']]

# 여러개는 ,'컬럼명' 넣어주면 된다
# titan_df[['Name','Age']]


# print(type(titan_df[['Name']]))  => [[]] 2차원 <class 'pandas.core.frame.DataFrame'> 
# print(type(titan_df['Name']))   => [] 1차원 <class 'pandas.core.series.Series'>

 

 

 

2-1. 해당조건의 열(column) 세로 뽑아보기 

# 3. Pclass 1인 정보 추출하기

titan_df[titan_df.Pclass==1]  # <class 'pandas.core.series.Series'>
# titan_df[titan_df['Pclass']==1] # 이렇게 해도됨


#titan_df[titan_df.Pclass==1].Pclass.value_counts() # 갯수

# print(type(titan_df[titan_df.Pclass==1]))  =>  <class 'pandas.core.frame.DataFrame'>
# print(type(titan_df.Pclass==1]))           => <class 'pandas.core.series.Series'>

 

여러가지 조건 

# and 조건일 때는 &  /  or 조건일 때는 |   / Not 조건일 때는 ~
# 60세넘는  1등급 여성 추출

titan_df[(titan_df.Pclass==1) & (titan_df.Sex=='female') & (titan_df['Age'] > 60)]

# Not 조건인 경우 (반대조건)
# titan_df[~((titan_df.Pclass==1) & (titan_df.Sex=='female') & (titan_df['Age'] > 60))]

 

2-2 여러가지 기능들

# 해당 열(Name)에 글자가 포함된 데이터 출력
titan_df[titan_df.Name.str.contains('Mrs')]

# 인덱스번호 재정렬
titan_df[titan_df.Name.str.contains('Mrs')].reset_index()

# 인덱스번호 재정렬상태에서 상위3개만 보여주기 
# titan_df[titan_df.Name.str.contains('Mrs')].reset_index().head(3) # 상위 3개
# titan_df[titan_df.Name.str.contains('Mrs')].reset_index()[:3]  # 상위 3개

# titan_df[titan_df.Name.str.contains('Mrs')].reset_index().tail(3) # 하위


# 결측치받기
.isna() # 표로 보여주기
.isna().sum() # 합쳐서 보여주기

 

3. 선택된 행(row) 가로만 뽑아보기

titan_df.loc[[0]] # loc 이름이 0인 행만 추출해줘
titan_df.iloc[[0]] # iloc 위치가 0번째 행인 값들만 추출해줘

# 단일값을 불러오기1 - loc(label::명칭) // iloc(Positional-위치)

titan_df.loc[[0]] # loc 이름이 0인 행만 추출해줘
titan_df.iloc[[0]] # iloc 위치가 0번째 행인 값들만 추출해줘

# iloc 경우 슬라이스 가능
# iloc [시작:끝:옵션]

#  테스트하기 위해서 행 이름 바꿀때 
# data_df.rename(index={'two': 1, 'one': 3}, inplace=True) # inplace 원본도 바꿀래?
data_df

 

3-1. loc/iloc 을 통한 행열 을 사용하여 하나의 값 뽑기

 

titan_df.loc[0,'Pclass'] 
# 3 출력

 
# titan_df.loc[[0,'Pclass']] 로 하면 "['Pclass'] not in index" 에러 뜸

 

 

3-2. loc/iloc 을 통한 행열 을 사용하여 여러개의 값 뽑기

 

titan_df.loc[:,'Pclass':'Age']  
# 행 [:] = 전부 , 열 ['Pclass':'Age'] Pclass부터 ~ Age 까지3-1. loc을 통한 행열 을 사용하여 하나의 값 뽑기



titan_df.iloc[:,2:6]  
# 와 동일한 값 (2열부터 ~ 2,3,4,5 까지) 6열 포함x

 

<원본>

titan_df

 

 

 

 

 

<조건으로 나온 값>

 

DataFrame 행(row)열(column) 추가 삭제

CRUD중 Create 와 Delete

1: DataFrame 생성 또는 불러오기

# csv 불러오기

import pandas as pd

# 절대경로
# file_path = '/Users/chris/Desktop/Develop/TIL/python/BIGDATA/test.csv'
# tset_df = pd.read_csv(file_path, engine='python') # DataFrame의 약자 df

# 상대경로
test_df = pd.read_csv("./test.csv", encoding="cp949")  # ./ 현재폴더    # encoding="cp949" 한글 인코딩 오류해결용
# 생성하기

import pandas as pd

# 딕셔너리 형태로 
df = pd.DataFrame({'A' : ['a1', 'a2', 'a3', 'a4'], 'B' : ['b1', 'b2', 'b3', 'b4'], 'C' : ['c1', 'c2', 'c3', 'c4']})


# 리스트 형태로 (api로 불러올때는 대부분 이런식)
df = pd.DataFrame([{'A' : 'a1', 'B' : 'b1', 'C' : 'c1'},
		   {'A' : 'a2', 'B' : 'b2', 'C' : 'c2'},
                   {'A' : 'a3', 'B' : 'b3', 'C' : 'c3'},
                   {'A' : 'a4', 'B' : 'b4', 'C' : 'c4'}])
 


df

 

 

2: DataFrame  행(row) 추가 / 열(column) 추가

 

 

# 행(row, 가로) 추가 
df.loc[len(df)] = ['st', 123, '아무거나']     # len(df) df : 행 인덱스  (숫자넣는곳)
df

 

 

# 열(column, 세로) 추가

df['새컬럼'] = 'new'
df

 

 

3: DataFrame  행(row)  / 열(column) 삭제

 

# 행(row)가로 삭제

df2 = df.drop(0, axis = 0) # axis = 0 (생략가능) 행 
df2 

#df2 = df.drop([0, 1],axis = 0) 여러개도 한번에 가능
#df2

# df.drop([0], axis = 0, inplace = true) # inplace = True / 리턴없이 원본이 수정됨 (결과창 안뜸)
# df.drop([0], axis = 0, inplace = false) # false(생략가능)인 경우 리턴은 있지만 원본은 그대로 (결과창 뜸)

# 원본을 저장하고 싶으면 =>
# df = df.drop([0], axis = 0, inplace = false) 로  df에 담아야함

# df = df.drop(df.index[[0, 1]]) #인덱스 번호로도 삭제가능 (행 이름이 문자일때 번호로 지우기용)

# 열 (column, 세로) 삭제

df2 = df.drop('A', axis = 1)  # axis = 1 열 
df2

Pandas 시리즈(Series)와 데이터프레임(Dataframe)

Pandas의 차원이해하기 

<class 'pandas.core.series.Series'> : 1차원

<class 'pandas.core.frame.DataFrame'> : 2차원

 

 

 

 

 

 

 

DataFrame

:  시리즈가 여러개 합쳐진 자료형
데이터프레임에서 하나의 행 또는 열만 뽑으면 그것은 시리즈이다.

열내의 데이터 같고, 열간의 데이터는 다름

 

 

 

 

차원에 대한 이해

import pandas as pd

dic = {'컬럼_열1': ['행_가','행_나','행_다'], '컬럼_열2': ['행_a', '행_b', '행_c'], '컬럼_열3': ['행_1', '행_2', '행_3']}


df = pd.DataFrame(dic)
df

pd.DataFrame(df[df.컬럼_열1=='행_가']['컬럼_열2'])

# [][] =>  [행][렬] 
#  [행] => [df.컬럼_열1=='행_가']  => '행_가'가 포함된 행_가, 행_a, 행_1을 뽑는다. 0번째 행을 뽑는다.
#  [열] => ['컬럼_열2'] => 행_a, 행_b, 행_c를 뽑고 곂치는 값을 출력한다.
#  행_a 출력

 

 

 


pd.DataFrame(df[df.컬럼_열2=='행_c']['컬럼_열3']) 
#을 한다면?

# 행_3 출력

 

행렬 가로 세로 도대체 무엇이 맞는가?

 

분명 이런사진을 본다면 마치 행이 세로 / 열이 가로 인 것처럼 보이지만 

 

 

행은 row = 가로

가로방향으로 값을 넣는다!! -> 값을 다 넣었으면 행축세로방향으로 늘어난다!

 

행 = 가로 = row = axis 0 (데이터를 넣는 방향)

행축(행이 증가하는방향) = 세로방향으로 증가

 

 

열은 column = 세로

 세로방향으로로 값을 넣는다!! -> 값을 다 넣었으면  로방향으로 늘어난다!

 

열 = 세로 = column = axis 1 (데이터를 넣는 방향)

열축(열이 증가하는방향) = 가로방향으로 증가

 

 

가로인지 세로인지는 데이터를 넣는 방향을 말하는것!

 

행열은 축 번호를 부르는것!

 

+ Recent posts