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 (데이터를 넣는 방향)

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

 

 

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

 

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

 

 

1.  1:1 관계

결혼관계테이블 : 남자 1 , 여자 1

사원증테이블 : 사원번호 1, 사원 1

주민등록번호테이블 : 번호 1, 사람 1 

  • 하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우이다.

 

 

 

2.  1:N 관계

 

: (나의)게시글 테이블

유저 1명, 게시글 N개

 

: (나의)강의테이블

학생 1명, 강의 N개 

 

: (카트속) 아이템

 

: (게시글에) 댓글

 

: 나라의 정부기관

 

 

 

이런식으로 테이블 2개를 활용해서 표현 가능함

 

 

 

 

 

 

3.  N: M 관계

https://docs.djangoproject.com/en/4.1/topics/db/examples/many_to_many/ 

 

https://cloudstudying.kr/lectures/501

Q: 수강신청 테이블을 만들려고 한다 어떻게 하면 좋을까?

과목에는 성과 사랑, 통계물리 수업이 있고, 5명이 수업을 들을려고 한다.

  성과 사랑 통계물리
홍길동 V --
김철수 -- V
손흥민 -- V
리처드파인만 -- V
아인슈타인 -- V

라고 만들면 -- 빈칸이 생기게 된다 -> 무결성 위배 (유저와, 과목테이블을 관계활용한 수강신청이라는 테이블을 하나 더 생성해야함)

 

----------------------------------------

N:M 관계 예시

 

: 좋아요 테이블(게시글 테이블과 비교)

좋아요는 여러명이 누름, 한 사람은 여러개의 좋아요 가능

하트는 여러개의 게시글에 들어간다,  

어떤 게시글인지, 어떤 유저 눌렀는지

 

: 대여테이블

책은 여러명에게 대여가능, 한 사람은 여러개 책 예약가능

어떤 책인지, 어떤 사람인지

 

: 수강신청테이블 (강의 테이블과 비교)

수강은 여러명에게 등록가능, 한 사람은 여러개 강의 등록가능

어떤 강의인지,  어떤학생이 듣는지 

 

 

: 좋아요 버튼 

 

: 투표

 

COOKIE 세션SESSION 필요성은 

 

 HTTP의 특징이자 약점을 보완하기 위해서이다.

그렇다면 이 HTTP의 특징은 무엇이고, 그로 인한 약점은 무엇일까?

 

HTTP 프로토콜

HTTP(Hypertext Transfer Protocol)는 인터넷 상에서 데이터를 주고받기 위해 서버 · 클라이언트 모델을 따르는 통신 규약이다. 이 HTTP 프로토콜의 특징은 비연결성(Connectionless)과 비상태성(Stateless)이다.

  1. 비연결성(Connectionless) : HTTP는 클라이언트가 서버에 요청을 보내면, 서버는 클라이언트에게 요청에 맞는 응답을 해 준 뒤 접속을 끊는다. 이에 대해서는 논란이 되는 부분이 있으나 여전히 접속을 끊음으로써 연결 비용을 줄이는 것이 HTTP의 장점이기 때문에 비연결성을 가지고 있다고 말한다.
  2. 비상태성(Stateless) : 상태 정보를 유지하지 않고. 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나게 되며, 상태 정보는 유지하지 않는다.

https://sunrise-new-world.tistory.com/21

 

1. 쿠키 Cookie  


상태가 없는 프로토콜을 위해 상태를 지속시키기 위한방법
웹 브라우저( 클라이언트) 의 정보를 웹 브라우저에 저장하므로,
이후 서버로 전송되는 요청에는 쿠키가 가지고 있는 정보가 같이 포함되서 전송된다.

 

ex) 자동로그인, 로그인 상태 유지
비번, 아이디 저장 팝업

 

* 쿠키의 2가지 방식
- 파일 쿠키 : 실제 파일로 남겨서 저장하는 방식

- 웹 쿠키 : 브라우저가 관리

 

 

 

1) 쿠키 동작 방식

 

 

2) 쿠키의 구성

       * 이름       : 각 쿠키를 구별하는데 사용되는 이름. (알파벳, 숫자 이용)
       * 값       : 쿠키의 이름과 같이 저장할 데이터.
       * 유효시간    : 쿠키가 유지되는 시간.
       * 도메인    : 쿠키를 전송할 도메인.
       * 경로       : 쿠키를 전송할 요청 경로.

      - 하나의 브라우저는 여러 개의 쿠키를 가질 수 있고 구분할 때, 이름을 사용.
       - 각 쿠키는 값을 가지며 서버는 이 값을 사용해 작업 수행.

3) 쿠키 생성
       쿠키를 사용하려면 Cookie 클래스를 사용하여 쿠키 객체를 생성해야함
       쿠키에는 각 웹 브라우저를 판별할 수 있는 정보 포함되어있음
       서버가 응답할때, response 객체에 실려 사용자 브라우저에 저장됨.
       정보 전달 방식은 Map(key, value) 형태이다.

       [ 쿠키 객체 생성 ]
Cookie cookie = new Cookie(String name, String value);

       [ 쿠키 유효기간 설정 ] ([ 도메인, path 도 설정])
cookie.setMaxAge(60);

       [ response 객체에 쿠키 추가]
reponse.addCookie(cookie);

name : 쿠키이름
value : 쿠키값

* 쿠키 생성후, 반드시 reponse 객체에 쿠키를 추가해야한다.
* value에 아스키코드가 아닌 값이 들어가야할때는 알맞은 방식으로 인코딩한다.

 

쿠키 클래스 메서드
String  getName() 쿠키 이름 가져오기
String getValue() 쿠키값 가져오기
void setValue(String value) 쿠키값 지정
void setDomain(String pattern) 이 쿠기가 전송될 서버 도메인 지정
String getDomain() 지정된 도메인 리턴
void setPath(String url) 이 쿠키를 전송할 경로 지정
String getPath() 지정된 경로 리턴
void getMaxAge() 쿠키 유효시간을 초단위로 지정.
음수로 입력할 경우 웹브라우저 닫을때 쿠키가 함께 삭제된다.
int getMaxAge() 쿠키 유효시간을 구함.

 

 

 쿠키 읽어오기

 

#1 쿠키 목록 얻기
존재하는 모든 쿠키 객체를 가져오려면
내장객체 request의 getCookies() 메서드를 사용해야함.

Cookie[] cookies =  request.getCookies();

#2. 쿠키 객체 정보 얻기
getName(), getValue() 이용해서 정보얻어야함.

 

 

 

쿠키 삭제

 setMaxAge(0)

 

 

쿠키는 삭제하는 기능을 별도로 제공하지 않고, 
쿠키 유효시간을 만료하면 삭제됨.
즉, setMaxAge(0) 으로 만들어 다시 저장되도록 응답으로 보내기

 

 

2. 세션 Session  
: 클라이언트와 웹 서버간의 상태를 지속적으로 유지하는 방법

 

 

 

세션 내부 객체
*Object getAttribute(String name) 세션에 저장된 속성명이 name인 값을 Object로 리턴
*void setAttribute(String name, Object value) 세션에 name 속성명으로 값 저장 (어떤 값이든 저장가능)
-> 브라우저가 종료되거나, 삭제할때까지 데이터 유지
*void  removeAttribute(String name)  //로그아웃 툴 1
속성명이 name인 속성셋을 삭제
*void  invalidate() //로그아웃툴 2
현재 세션에 저장된 모든 속성 제거
java.util.Enumeration getAttributeNames() 세션 속성명들을 Enumeration으로 리턴
long getCreationTime() 세션이 생성된 시간 리턴
long getLastAccessedTime() 웹 브라우저가 해당 세션에 마지막으로 접근한 시간 리턴
int getMaxInactiveInterval() 해당 세션을 유지하기 위한 세션 유지시간 리턴.
void setMaxInactiveInterval (int interval) 해당 세션을 유지하기 위한 세션 유지시간 초단위로 설정
default 1800초 (30분) 동안 로그인 유지됨

 

 

 

 

 

 

  쿠키(Cookie) 세션(Session)
저장 위치 방문자(클라이언트) 서버
용량 제한 도메인당 20개, 쿠키당 4KB이하 용량 제한 없음
저장 형식 text Object
만료 시점 쿠키 저장 시 설정 가능. 따로 설정하지 않을 경우, 브라우저가 종료될 때 만료 정확한 시점을 알 수 없음
보안 보안 취약

보안우수

 

 

 

 

+ Recent posts