0. 오늘은 파이썬 관련해서 내용을 정리해보려고 한다.
꼭 TIL 을 하나만 적으라는 법은 없으니까! 일단은 라이브 강의를 다시 복습하면서 파이썬에 대해서 정리하려고 한다.
강의가 끝나면 프로그래머스 해설도 천천히 해봐야지.. 코드를 뜯어보는게 중요하다고 생각하니까.


1. Merge 와 Join

Merge 는 SQL의 Join과 동일한 역할을 하고 있다. 단, 차이점이 있으며 파라미터(주요 옵션)도 다르다. 일단은 Merge 와 Join을 표로 정리해서 이를 구분해보려고 한다.

 **Parameter
 1. on = SQL 과 동일하게 작동한다.
 2. how = 어떤 JOIN 방식을 사용할 것인지
 3. left on / right on

  MERGE JOIN
결합기준 칼럼을 기준으로 두 데이터 프레임을 결합
(유연성이 높다.)
인덱스를 기준으로 두 데이터 프레임을 결합
응용 결합의 기준이 되는 칼럼을 지정 결합의 기준이 되는 칼럼을 지정할 수도 있고, 인덱스를 기준으로 결합할 수도 있음
사용법 Pandas 라이브러리의 함수 중 하나,
두 데이터 프레임을 input 으로 받는다.
(수평 결합)
결합의 기준이 되는 칼럼을 지정할 수 있으며,
인덱스를 기준으로 결합할 수 있음
(수직결합)
파라미터
(주요 옵션)
on : 조건의 칼럼의 갯수
(단일 혹은 복수)
how : 어떤 조인 방식을 사용할 것인지
(inner, outer, left, right)
left on / right on : 열기준 병합시 기준으로 할 열의 양측 이름이 다를때, 지정하는 옵션
sort : 병합 후 인덱스 정렬 여부
(True / False)
suffixes : 중복된 칼럼 이름의 처리
indicator: True 로 할 경우, 마지막 열에 병합 정보를 출력
how : 어떤 조인 방식을 사용하는지
(inner, outer, left, right)
Isuffix / rsuffix : 이름이 같은 칼럼이 있을 경우,
문자열을 지정해 부여
sort : 인덱스 정렬 여부
차이점 수평결합

칼럼을 2개 이상 받음
EX) merge_df = pd.merge(df2,df3)
수직 결합

칼럼을 1개로 받음
EX) df2.join(df3)

Merge 와 Join 문법 정리

 1) Merge

df2['Customer ID']=df3['user id']

merge_df= pd.merge(df2,df3)
데이터 프레임 합치기 = 판다스 라이브러리를 사용해 df2,df3을 합친다

#동일 기능
merge_df = pd.merge(df2,df3, how='inner', on='Customer ID')

#공통 칼럼 2개 이상
merge_df = pd.merge(df2,df3, how='inner/left/right/outer(조인 방식)',on=['공통칼럼1','공통칼럼2']

##기준열 이름이 다를 때
merge_df = pd.merge(df2,df3,how='inner',left_on='왼쪽 기준열',right_on='오른쪽 기준열')

##공통칼럼을 개별로 출력하고 싶을 때
merge_df = pd.merge(df2,df3,how='inner',on='Customer ID', suffixes=('_left','_right'))
 ➡️ 해당 방식으로 출력하면 아이디 1, 아이디 2 순으로 나온다.

 2) Join

#단순한 Join
df2.join(df3) ➡️ 1개의 df를 사용함

#join 방식 설정
df2.join(df3,how='right')

#join시 이름이 같은 칼럼이 있을 경우, 옵션을 설정해서 조인 가능
df.join(df,how='left',lsuffix='1', rsuffix-'2')
 ➡️suffixes 는 인수를 튜플로 두값을 한꺼번에 입력한다.
 ➡️객체들간 이름이 중복되는 열이 있다면, 해당 열에 붙일 접미사를 정한다.
 
#join 이후, 인덱스 정렬하기
df.join(df,how='left',lsuffix='1', rsuffix-'2', sort=True)

TIP) sort() sorted()는 차이가 난다.

sort() 1. 기존의 리스트를 병렬한다.
2. 리스트 내에서만 정의될 수 있다.
sorted() 1. 새로운 정렬된 리스트를 만든다.

2. concat 과 append

  Concat Append
결합기준 수직, 수평결합 모두 가능 수직결합만 가능
해당 함수는 없어질 가능성이 존재함
개념 여러 데이터 프레임 또는 시리즈를 특정 축을 따라서 연결하는 데 사용한다. 데이터 프레임에 '행'(수직 결합)을 추가하는 메서드
두 데이터 프레임을 행 기준으로 결합
주요 옵션 axis : 수직 결합 / 수평 결합의 여부
(axis=0: 수직결합(기본값),axis=1: 수평결합)
join : 어떤 방식의 조인을 사용할 것인지 결정
(inner, outer, left, right)
keys: 데이터 프레임 축이름 지정
ignore_index=True: 인덱스 재배열
sort: 열을 사전적으로 정렬할 지 여부

단순 결합과 없는건 NAN 처리를 한다.
넣은 데이터 프레임이 제시한 데이터 프레임 밑으로 들어간다.

 1) Concat

##기본 작성 방법
pd.concat([df2,df3])

##세로로 결합
pd.concat([df2,df3], axis=0, ignore_index=True, join='inner')

##가로로 결합
pd.concat([df2,df3], axis=1, ignore_index=True, join='inner')

 2) append

##기본 작성 방법
df.append(df2)

3. 피벗 테이블

피벗테이블의 정의 : 데이터의 열을 기준으로 피벗테이블로 변환시키는 함수

주요 옵션 'index','columns','values'

  columns : 열로 시용될 열
index : 축으로 사용될 열 values : 값으로 사용될 열

index 및 columns 를 리스트 형태로 입력한 경우, 멀티 인덱스 기반 피벗테이블이 형성
value 에 리스트를 입력할 경우 각 값에 대한 테이블이 연속적으로 생성된다.
(--> 이건 이해가 안가서 다음 페이지에서 참조함)

index1 index2 columns
10대 남성 values
10대 여성  
20대 남성  
 

09-09. 피벗변환 (pivot)

####DataFrame.pivot(index=None, columns=None, values=None) ##개요 `pivot`메서드는 데이터의 열을 기준으로 피벗테이블로 변환시…

wikidocs.net

 1). 기본 생성

df.pivot_table(index='Machine', columns='Country',values='Price)
>>
Country  china  Japan  Korea
Machine    
PC         1      1      1
TV         3      5      8

2) Values 의 값을 리스트로 넣기

만약에 values 에 따로 입력하지 않으면 남은 모든 열들이 values 에 입력되어 연속으로 출력된다.

df.pivot_table(index='Machine',columns='Country',values=['Price','Brand'])
>>
             price			        brand
country | china japan korea | china japan korea
Machine
PC          1     1     1   |   C     G     P
TV          3     5     8   |   가    나    다

이 상태에서 [열 이름] 형태를 붙여서 원하는 values 만 출력할 수 있다.

df.pivot_table(index='Machine',columns='Country')['Brand']
>>
       	        brand
country | china japan korea
Machine
PC         C     G     P
TV         가    나    다

 3) aggfunc : 어떤 계산을 할 지

집계 함수 코드 및 기능
합계 aggfunc = 'sum'
평균 aggfunc = 'mean'
표준 편차 aggfunc = 'std'
갯수 aggfunc = 'count'
갯수 (중복 제거) aggfunc = 'nunique'
최대값 aggfunc = 'max'
최소값 aggfunc = 'min'
fill_value (결측치 처리) NaN(결측치) 값을 처리하고 싶을 때 사용, fill_value=0 이 가장 많이 사용된다.
EX) df.fill_value(df)
dropna (결측치 삭제) 결측치(na) 삭제 여부 결정
 EX) df.dropna(df)
sort (정렬) index or columns 기준으로 정렬
 EX) sort_index(ascending = True(or False)
 df = df.sort_values(ascending=True(오름차순)(or False(내림차순))

3. QCC 테스트 3번 정리

SELECT
    CityName AS city_name,
    CountryName AS country_name,
    Continent AS continent_name,
    Population AS population
FROM (
    SELECT
        c.Name AS CityName,
        co.Name AS CountryName,
        co.Continent,
        c.Population,
        ROW_NUMBER() OVER (PARTITION BY co.Continent ORDER BY c.Population DESC) AS PopulationRank
    FROM qcc.country co
    JOIN qcc.city c ON c.CountryCode = co.Code
) ranked_cities
WHERE
    PopulationRank = 1
ORDER BY
    Population DESC

일단인 지난번 QCC 가 이렇다고 했는데, 내가 쓴 답은 아마 지난번에 있을 것이다.

 

[𝟐𝟓.𝟎𝟑.𝟏𝟒] 𝐓𝐈𝐋 𝐍𝐎𝐓𝐄 𝟏𝟖

0. 개요오늘 QCC 테스트를 보고 이번에 피드백 받은거랑 다른 함수를 사용해서 다른 문제 풀이를 해보려고 한다.1. QCC 테스트1번 문제는 확인해보자면 ➡️ 전년에 비해서 올해 GNP가 낮은 국가들

bom-rosy.tistory.com

일단 3개 중에서 2개를 맞았으니 그거로라도 위안을 삼으려고 한다. 처음에는 다 틀려서 0 이었는데, 그래도 2개 맞은거면 힘낸거니까...

SELECT B.name AS CITY_NAME, A.Name AS COUNTRY_NAME,A.continent,Max(C.population) AS Population
FROM country A INNER JOIN city B ON A.code = B.countrycode 
               INNER JOIN (SELECT name,countrycode, Max(population) as Population FROM city GROUP BY Population) AS C ON A.code = C.countrycode
WHERE B.name is not null
GROUP BY A.continent
ORDER BY Population desc
SELECT B.name AS CITY_NAME, A.Name AS COUNTRY_NAME,A.continent,Max(C.population) AS Population
FROM country A INNER JOIN city B ON A.code = B.countrycode 
               INNER JOIN (SELECT continent, Max(population) as Population FROM city GROUP BY continent) AS C ON A.continent = C.continent
WHERE B.name is not null
GROUP BY A.continent
ORDER BY Population desc

분~명히 이렇게 하시라고 하셨는데... 안맞아서 이거 다시 써야 할 거 같다.

뭄바이가 나와야하는데... 안나왔어요.. 그리고 결론적으로 풀이 도와주신건 감사하긴 한데, 그... city 에서 일부러 MAX를 구한건데 의도를 잘못 이해하셨을 수도 있겠다 싶었다. 근데 대놓고 이건 틀린거에요 할 수도 없을 수...도 있으니까 그러려니 하려고 한다.

계속 도전은 하고 있는데 잘 안되서 내일 마저 해야지...


요새 잘하고 있는지 좀 불안하다. 다른 분들은 알고리즘도 달하고 그러는데, 나는 뭔가 진전도 없고...
거기에 따라가려고 수업도 제깍 듣는데 잘 모르겠어서 다시 한번 듣는다. 이번에도 lambda 함수랑 도 다 연습도 해봤는데.

튜터님이 말씀하신 대로 막... 이것저것 하는데, 왜 안될까? 너무 속상했다.
일단은 계속 손으로 써봐가면서 계속 익혀야겠다.

myo