Python Pandas 라이브러리 3 (데이터 조작)
Pandas(데이터 조작)
데이터 개수 확인
# 데이터 프레임의 개수 확인
tips.count()
len(tips)
244
기타 데이터 정보 확인
# 데이터프레임 인덱스 보기
tips.index
RangeIndex(start=0, stop=244, step=1)
# 데이터프레임 컬럼 보기
tips.columns
Index(['total_bill', 'tip', 'sex', 'smoker', 'day', 'time', 'size', 'total'], dtype='object')
# 행, 열 구조 보기
tips.values
array([[16.99, 1.01, 'Female', ..., 'Dinner', 2, 18.0],
[10.34, 1.66, 'Male', ..., 'Dinner', 3, 12.0],
[21.01, 3.5, 'Male', ..., 'Dinner', 3, 24.51],
...,
[22.67, 2.0, 'Male', ..., 'Dinner', 2, 24.67],
[17.82, 1.75, 'Male', ..., 'Dinner', 2, 19.57],
[18.78, 3.0, 'Female', ..., 'Dinner', 2, 21.78]], dtype=object)
정렬
# '지급액' 열(by='total_bill')을 기준으로 index(axis=0)오름차순 정렬하기
tips.sort_values(by=['total_bill'], axis=0)
# 지급액'열(by='total_bill')을 기준으로 index(axis=0) 내림타순 정렬하기 ascending = False 옵션 추가
tips.sort_values(by=['total_bill'], axis=0, ascending=False)
# 열 이름을 (알파벳 순서로) 정렬하기: axis = 1
tips.sort_index(axis=1)
행/열 합계
# 행 합계를 구할 때는 sum(axis=1) 메서드를 사용한다.
tips.sum(axis=1)\
# 열 합계를 구할 때는 sum(axis=0) 매서드를 사용하는데 axis인수의 디폴드 값이 0이므로 axis생략 가능
tips.sum()
교차 분석
빈도 분석
# 성별 범주형 빈도 분석
tips['sex'].value_counts()
# 요일별 범주형 빈도 분석
tips['day'].value_counts()
# 여백 또는 누적값 cumulatives
pd.crosstab(tips['sex'],tips['day'],margins=True)
# 전체 빈도 비율 확인
pd.crosstab(tips['sex'],['day']).apply(lambda r: r/len(tips), axis=1)
연속형 변수 Describe
# 판다스는 describe()함수를 통해 연속형 변수의 기술 통계를 출력한다.
# 개수(count), 데이터의 평균(mean), 표준편차(std), 최솟값(min),
# 4분위수(25%, 50%, 75%), 최댓값(max)
tips.describe()
시각화
# 기본 선
tips.plot() # 또는 tips.plot(kind='line')
# 히스토그램
tips.plot(kind='hist')
# 박스플룻
tips.plot(kind='box')
데이터 병합과 연결
데이터 연결
# 시리즈를 데이터프레임의 새로운 행으로 연결하려면
s1 = pd.Series([0,1], index=['A','B'])
s2 = pd.Series([2,3,4], index=['c','d','e'])
pd.concat([s1,s2])
출력
A 0
B 1
c 2
d 3
e 4
dtype: int64
# 데이터프레임의 열을 연결하고 싶으면 axis=1 을 인수로 설정한다.
df1 = pd.DataFrame([['Dog','3'],['Bird','10'],['Tiger','6'],['Moose','3']], index = ['0','1','2','3'], columns = ['동물','나이'])
df2 = pd.DataFrame([['집','0'],['초원','0'],['수풀','0'],['초원','1']], index = ['0','1','2','3'], columns = ['사는 곳','뿔의 개수'])
pd.concat([df1, df2], axis=1)
출력
동물 나이 사는 곳 뿔의 개수
0 Dog 3 집 0
1 Bird 10 초원 0
2 Tiger 6 수풀 0
3 Moose 3 초원 1
데이터 병합
df1 = pd.DataFrame({'고객번호':[1001, 1002, 1003, 1004, 1005, 1006, 1007], '이름':['강감찬','홍길동','이순신','장보고','유관순','신사임당','세종대왕']}, columns = ['고객번호','이름'])
df2 = pd.DataFrame({'고객번호':[1001, 1001, 1005, 1006, 1008, 1001],'금액':[10000, 20000, 15000, 5000, 100000, 30000]}, columns=['고객번호','금액'])
# inner join 양쪽 다 같은 것
pd.merge(df1, df2)
# Full join 방식은 키 값이 한쪽에만 있어도 데이터를 출력한다. 전부 출력
pd.merge(df1, df2, how = 'outer')
# left, right 방식은 각각 첫 번째 혹은 두 번쨰 데이터프레임의 키 값을 모두 보여 준다.
pd.merge(df1, df2, how = 'left')
pd.merge(df1, df2, how = 'right')
출력
inner join
고객번호 이름 금액
0 1001 강감찬 10000
1 1001 강감찬 20000
2 1001 강감찬 30000
3 1005 유관순 15000
4 1006 신사임당 5000
full join
고객번호 이름 금액
0 1001 강감찬 10000.0
1 1001 강감찬 20000.0
2 1001 강감찬 30000.0
3 1002 홍길동 NaN
4 1003 이순신 NaN
5 1004 장보고 NaN
6 1005 유관순 15000.0
7 1006 신사임당 5000.0
8 1007 세종대왕 NaN
9 1008 NaN 100000.0
left join
고객번호 이름 금액
0 1001 강감찬 10000.0
1 1001 강감찬 20000.0
2 1001 강감찬 30000.0
3 1002 홍길동 NaN
4 1003 이순신 NaN
5 1004 장보고 NaN
6 1005 유관순 15000.0
7 1006 신사임당 5000.0
8 1007 세종대왕 NaN
right join
고객번호 이름 금액
0 1001 강감찬 10000
1 1001 강감찬 20000
2 1001 강감찬 30000
3 1005 유관순 15000
4 1006 신사임당 5000
5 1008 NaN 100000