python pandas 정리4_Dataframe3

2 minute read

1. Concat 함수 데이터프레임 결합

단순하게 두개의 데이터프레임에서 컬럼의 종류나 행의 개수가 같은 것을 합침

df1 = pd.DataFrame({'key1' : np.arange(5), 'value1' : np.random.randn(5)})
df2 = pd.DataFrame({'key1' : np.arange(5), 'value1' : np.random.randn(5)})
#칼럼명이 같고 행의 개수가 5개로 같은 데이터프레임 생성

pd.concat([df1,df2])
	key1	value1
0	0	0.843955
1	1	0.991502
2	2	-0.637123
3	3	0.370595
4	4	2.349160
0	0	2.169253
1	1	-0.911121
2	2	1.887487
3	3	-0.599125
4	4	-1.368194

pd.concat([df1,df2], ignore_index=True) #기존 index를 무시하고 다시 0베이스 index를 생성함
	key1	value1
0	0	0.843955
1	1	0.991502
2	2	-0.637123
3	3	0.370595
4	4	2.349160
5	0	2.169253
6	1	-0.911121
7	2	1.887487
8	3	-0.599125
9	4	-1.368194


#만약 행으로 concat를 수행할 때, column명이 다르면 없는 컬럼명에 NaN이 발생함

# 단순한 수평 결합
pd.concat([df1,df2],  axis=1)
	key1	value1	key1	value1
0	0	0.843955	0	2.169253
1	1	0.991502	1	-0.911121
2	2	-0.637123	2	1.887487
3	3	0.370595	3	-0.599125
4	4	2.349160	4	-1.368194

2. Merge & join함수로 데이터 프레임 결합

출처 : 온라인 패스트캠퍼스 온라인 강의 노트

dataframe merge

  • SQL의 join처럼 특정한 column을 기준으로 병합

    • join 방식: how 파라미터를 통해 명시
      • inner: 기본값, 일치하는 값이 있는 경우
      • left: left outer join
      • right: right outer join
      • outer: full outer join
  • pandas.merge 함수가 사용됨

자료 출처: 온라인 패스트캠퍼스 온라인 강의자료

customer = pd.DataFrame({'customer_id' : np.arange(6),
                    'name' : ['철수'"", '영희', '길동', '영수', '수민', '동건'],
                    '나이' : [40, 20, 21, 30, 31, 18]})

customer
	customer_id	name	나이
0		0		철수		40
1		1		영희		20
2		2		길동		21
3		3		영수		30
4		4		수민		31
5		5		동건		18    

orders = pd.DataFrame({'customer_id' : [1, 1, 2, 2, 2, 3, 3, 1, 4, 9], 'item' : ['치약', '칫솔', '이어폰', '헤드셋', '수건', '생수', '수건', '치약', '생수', '케이스'], 'quantity' : [1, 2, 1, 1, 3, 2, 2, 3, 2, 1]})
orders
	customer_id	item	quantity
0		1		치약		1
1		1		칫솔		2
2		2		이어폰		1
3		2		헤드셋		1
4		2		수건		3
5		3		생수		2
6		3		수건		2
7		1		치약		3
8		4		생수		2
9		9		케이스		1


pd.merge(customer,orders, on='customer_id')
	customer_id	name	나이	item	quantity
0		1		영희	20	치약	1
1		1		영희	20	칫솔	2
2		1		영희	20	치약	3
3		2		길동	21	이어폰	1
4		2		길동	21	헤드셋	1
5		2		길동	21	수건	3
6		3		영수	30	생수	2
7		3		영수	30	수건	2
8		4		수민	31	생수	2
#inner조인이기 때문에 주문 내역이 없는 동건을 join에서 제외됨, 또한 고객테이블에 없는 9번 고객도 제외됨

pd.merge(customer,orders, on='customer_id',how='left')
	customer_id	name	나이	item	quantity
0		0		철수		40	NaN		NaN
1		1		영희		20	치약		1.0
2		1		영희		20	칫솔		2.0
3		1		영희		20	치약		3.0
4		2		길동		21	이어폰		1.0
5		2		길동		21	헤드셋		1.0
6		2		길동		21	수건		3.0
7		3		영수		30	생수		2.0
8		3		영수		30	수건		2.0
9		4		수민		31	생수		2.0
10		5		동건		18	NaN		NaN

pd.merge(customer,orders, on='customer_id',how='right')
pd.merge(customer,orders, on='customer_id',how='outer')

customer1=customer.set_index('customer_id')
orders1=orders.set_index('customer_id')
pd.merge(customer1,orders1,left_index=True,right_index=True)
pd.merge(customer1,orders,left_index=True,right_on="customer_id")
#꼭 on이 아니더라도 left_index, right_on같은 속성으로 merge가능


#연습문제
#1.가장 많이 팔린 아이템은?
df3=pd.merge(customer,orders, on='customer_id',how='left')
df3.groupby("item").sum().sort_values(by="c", ascending=False)
	나이	customer_id	quantity
item			
수건	51		5		5
생수	61		7		4
치약	40		2		4
칫솔	20		1		2
이어폰	21		2		1
헤드셋	21		2		1

#2.영희가 가장 많이 구매한 아이템은?
df3.groupby(["name","item"]).sum().loc['영희','quantity']
item
치약    4
칫솔    2
Name: quantity, dtype: int64

join 함수

  • 내부적으로 pandas.merge 함수 사용
  • 기본적으로 index를 사용하여 left join

customer1.join(orders1,how=’inner’) 인덱스를 사용하기 때문에 인덱스를 만들고 join실시



Leave a comment