Recent Posts
Recent Comments
Link
Today
Total
02-09 05:32
관리 메뉴

Hippo's data

Pandas판다스 라이브러리-2 본문

Python

Pandas판다스 라이브러리-2

Hippo's data 2023. 9. 13. 21:21
728x90

오늘도 저번에 이어서 Pandas라이브러리인데요

 

책 <모두의 딥러닝-개정3판> 부록을 참고하여 판다스 Pandas에서 유용하게 쓰이는 공식들을 알아보겠습니다 

 

목차

A. 데이터 만들기
B. 데이터 정렬하기
C. 행 추출하기
D. 열 추출하기
E. 행과 열 추출하기
F. 중복 데이터 다루기
G. 데이터 파악하기
H. 결측치 다루기
I. 새로운 열 만들기
J. 행과 열의 변환
K. 시리즈 데이터 연결하기
L. 데이터 프레임 연결하기
M. 데이터 병합하기
N.  데이터 가공하기
O. 그룹별로 집계하기

 

loc, iloc ->과 관련된

[ ] -> 추출

 

번외) 데이터 프레임 생성시 주의

# 각각 열이름 지정시 -> 열방향으로 입력됨

df = pd.DataFrame(
    {"a": [1,2,3],
     "b":[4,5,6],
     "c":[7,8,9]}
)
df

# columns로 열이름 한번에  지정시 -> 행방향으로 입력됨

df = pd.DataFrame([[1,2,3],
                  [4,5,6],
                  [7,8,9]],
                  columns=['a','b','c'])
df

 

G. 데이터 파악하기

df

38. 각 열의 합 보기

df.sum()

39. 각 열의 값이 모두 몇 개인지 보기 -> 4개 행임 => 행의 개수와 동일

df.count()

40. 각 열의 중간 값 보기

df.median()

41. 특정 열의 평균 값 보기

df['b'].mean()

-> 9.5

42. 각 열의 25%, 75%에 해당하는 수 보기

df.quantile([0.25,0.75])

43. 각 열의 최솟값 보기

df.min()

44. 각 열의 최댓값 보기

df.max()

45. 각 열의 표준편차 보기

df.std()

46. 데이터 프레임 각 값에 일괄 함수 적용하기 - sqrt 제곱근

import numpy as np
df.apply(np.sqrt)  # 제곱근 구하기

넘파이 라이브러리 호출 후 계산 (넘파이Numpy -> 벡터 및 행렬연산에 유용)

***apply -> 행or열방향으로 함수 일괄적용

apply(함수 , axis=0 열 / axis=1 행)  / 기본값 => axis=0 열 

*** apply함수 예제

- 열 방향 sum함수(합) 적용

df.apply(sum, axis=0)

- 행 방향 sum함수(합) 적용

df.apply(sum,axis=1)

H. 결측치 다루기

# 넘파이 라이브러리를 이용해 null 값이 들어 있는 데이터 프레임 만들기

df = pd.DataFrame(
    {"a" : [4 ,5, 6, np.nan],
     "b" : [7, 8, np.nan, 9],
     "c" : [10, np.nan, 11, 12]},
    index = pd.MultiIndex.from_tuples
        [('d', 1), ('d', 2), ('e', 1), ('e', 2)],
        names=['n', 'v']))
df

-> MultiIndex -> 다중인덱스 생성 

47. null 값인지 확인하기

pd.isnull(df)

48. null 값이 아닌지를 확인하기

pd.notnull(df)

49. null 값이 있는 행 삭제하기 /  null 값 있는 열 삭제 ->  df.dropna(axis = 1) 

df_notnull = df.dropna()
df_notnull

50. null 값을 특정한 값으로 대체하기

df_fillna = df.fillna(13)
df_fillna

-> null값을 13으로 대체

51. null 값을 특정한 계산 결과으로 대체하기

df_fillna_mean = df.fillna(df['a'].mean())   # a열의 평균 값으로 대체
df_fillna_mean

I. 새로운 열 만들기

# 새로운 열 만들기 실습을 위한 데이터 프레임 만들기
df = pd.DataFrame(
    {"a" : [4 ,5, 6, 7],
     "b" : [8, 9, 10, 11],
     "c" : [12, 13, 14, 15]},
    index = pd.MultiIndex.from_tuples(      # 인덱스를 튜플로 지정합니다.
        [('d', 1), ('d', 2), ('e', 1), ('e', 2)],
        names=['n', 'v']))                  # 인덱스 이름을 지정합니다.
df

52. 조건에 맞는 새 열 만들기

df['sum'] = df['a']+df['b']+df['c']
df

-> sum이라는 새로운 변수(열) 생성 

53. assign()을 이용해 조건에 맞는 새 열 만들기

df = df.assign(multiply=lambda df: df['a']*df['b']*df['c'])    # a,b,c열의 값을 모두 곱해 d열을 만들어 줍니다.
df

-> multiply변수 생성 - a,b,c 값 모두 곱한값 

54. 숫자형 데이터를 구간으로 나누기 - qcut

df['qcut'] = pd.qcut(df['a'], 2, labels=["600이하","600이상"])  # a열을 2개로 나누어 각각 새롭게 레이블을 만들라는 의미
df

55. 기준 값 이하와 이상을 모두 통일시키기 lower -> 이하값 /  upper 이상값 변환

df['clip'] = df['a'].clip(lower=5,upper=6)  # a열에서 5이하는 모두 5로, 6 이상은 모두 6으로 변환
df

56. 최댓값 불러오기

df.max(axis=0)   #axis=0은 행과 행 비교, axis=1은 열과 열 비교

57. 최솟값 불러오기

df.min(axis=0)

J. 행과 열의 변환

# 열을 행으로, 행을 열로 변형하기

# 실습을 위해 새로운 데이터를 만듭니다.
df = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c'},
                   'B': {0: 1, 1: 3, 2: 5},
                   'C': {0: 2, 1: 4, 2: 6}})
df

58. 모든 열을 행으로 변환하기   / melt -> 녹이다 

pd.melt(df)

59. 하나의 열만 행으로 이동시키기 -> B열만 melt 녹이기

pd.melt(df, id_vars=['A'], value_vars=['B'])    # A열만 그대로, B열은 행으로 이동시키기

60. 여러 개의 열을 행으로 이동시키기 -> B, C열 melt 녹이기

df_melt = pd.melt(df, id_vars=['A'], value_vars=['B','C'])    # A열만 그대로, B열과 C열은 행으로 이동시키기
df_melt

61. 특정 열의 값을 기준으로 새로운 열 만들기   / index 기준으로 columns와 values 재분배

df_pivot = df_melt.pivot(index='A', columns='variable', values='value')  # A열을 새로운 인덱스로 만들고, B열과 C열을 이에 따라 정리
df_pivot

62. 원래 데이터 형태로 되돌리기

df_origin = df_pivot.reset_index()  # 인덱스를 리셋
df_origin.columns.name = None       # 인덱스 열의 이름을 초기화
df_origin

K. 시리즈 데이터 연결하기

# 시리즈 데이터 만들기
s1 = pd.Series(['a', 'b'])
s1

# 시리즈 데이터 2
s2 = pd.Series(['c', 'd'])
s2

63. 시리즈 데이터 합치기

pd.concat([s1, s2])

64. 데이터 병합 시 새로운 인덱스 만들기

pd.concat([s1, s2], ignore_index=True)

65. 계층적 인덱스 추가하고 열 이름 지정하기

pd.concat([s1, s2],
          keys=['s1', 's2'],
          names=['Series name', 'Row ID'])

L. 데이터 프레임 연결하기

# 데이터 프레임 합치기 -> columns로 열이름 한번에 입력 -> 행방향으로 입력됨

# 데이터 프레임 1
df1 = pd.DataFrame([['a', 1],
                    ['b', 2]],
                       columns=['letter', 'number'])
df1

# 데이터 프레임 2
df2 = pd.DataFrame([['c', 3],
                    ['d', 4]],
                   columns=['letter', 'number'])
df2

# 데이터 프레임 3
df3 = pd.DataFrame([['c', 3, 'cat'],
                    ['d', 4, 'dog']],
                       columns=['letter', 'number', 'animal'])
df3

#데이터 프레임 4
df4 = pd.DataFrame([['bird', 'polly'],
                    ['monkey', 'george']],
                   columns=['animal', 'name'])
df4

66. 데이터 프레임 합치기 -> 기본값 axis = 0 -> 열방향으로 합쳐짐

pd.concat([df1, df2])

67. 열의 수가 다른 두 데이터 프레임 합치기 -> 빈곳 NaN 채워짐

pd.concat([df1, df3])

68. 함께 공유하는 열만 합치기 -> join="inner" 이용

pd.concat([df1, df3], join="inner")

-> letter, number열 공유중임 

# 번외) join="outer" 이용 -> 모든 열 등장

pd.concat([df1, df3], join="outer")

->  letter, number, animal열 등장함

69. 열 이름이 서로 다른 데이터 합치기 

pd.concat([df1, df4], axis=1)

M. 데이터 병합하기

# 실습을 위한 데이터 프레임 만들기 1
adf = pd.DataFrame({"x1" : ["A","B","C"],
                    "x2": [1,2,3]})
adf

# 데이터 프레임 만들기 2
bdf = pd.DataFrame({"x1" : ["A","B","D"],
                    "x3": ["T","F","T"]})
bdf

# 데이터 프레임 만들기 3
cdf = pd.DataFrame({"x1" : ["B","C","D"],
                    "x2": [2,3,4]})
cdf

70. 왼쪽 열을 축으로 병합하기 -> merge 이용 

pd.merge(adf, bdf, how='left', on='x1')
# x1을 키로 해서 병합, 왼쪽(adf)를 기준으로
# 왼쪽의 adf에는 D가 없으므로 해당 값은 NaN으로 변환

71. 오른쪽 열을 축으로 병합하기

pd.merge(adf, bdf, how='right', on='x1')
# x1을 키로 해서 병합, 오른쪽(bdf)을 기준으로
# 오른쪽의 bdf에는 C가 없으므로 해당 값은 NaN으로 변환

72. 공통의 값만 병합 inner

pd.merge(adf, bdf, how='inner', on='x1')

73. 모든 값을 병합 outer

pd.merge(adf, bdf, how='outer', on='x1')

74. 특정한 열을 비교하여 공통 값이 존재하는 경우만 가져오기

adf[adf.x1.isin(bdf.x1)]
# adf와 bdf의 특정한 열을 비교하여 공통 값이 존재하는 경우만 가져오기
# adf.x1열과 bdf.x1열은 A,B가 같다. 따라서 adf의 해당 값만 출

75. 공통 값이 존재하는 경우 해당 값을 제외하고 병합하기 -> ~ not 의미

adf[~adf.x1.isin(bdf.x1)]  # 해당 값만 빼고 출력

76. 공통의 값이 있는 것만 병합

pd.merge(adf, cdf)

77. 모두 병합

pd.merge(adf, cdf, how='outer')

78. 어디서 병합되었는지 표시하기 -> indicator=True

pd.merge(adf, cdf, how='outer', indicator=True)

79. 원하는 병합만 남기기 -> query('_merge == " " ') 

pd.merge(adf, cdf, how='outer', indicator=True).query('_merge == "left_only" ')

-> - left_only만남김

80. merge 컬럼 없애기 -> drop(columns=['_merge'])

pd.merge(adf, cdf, how='outer', indicator=True).query('_merge == "left_only"').drop(columns=['_merge'])

N.  데이터 가공하기

# 실습을 위해 데이터 프레임을 만들어 줍니다.
df = pd.DataFrame(
        {"a" : [4 ,5, 6, 7],   # 열 이름을 지정해 주고 시리즈 형태로 데이터를 저장합니다.
        "b" : [8, 9, 10, 11],
        "c" : [12, 13, 14, 15]},
        index = [1, 2, 3, 4])  # 인덱스는 1,2,3으로 정해 줍니다.
df

81. 행 전체를 한 칸 아래로 이동하기

df.shift(1)

82. 행 전체를 한 칸 위로 이동하기

df.shift(-1)

83. 윗 행부터 누적해서 더하기

df.cumsum()

84. 새 행과 이전 행을 비교하면서 최댓값을 출력

df.cummax()

85. 새 행과 이전 행을 비교하면서 최솟값을 출력 

df.cummin()

86. 윗 행부터 누적해서 곱하기

df.cumprod()

O. 그룹별로 집계하기

# 실습을 위해 데이터 불러오기
!git clone https://github.com/taehojo/data.git

# 모두의 딥러닝 15장, 주택 가격 예측 데이터를 불러 옵니다.
df = pd.read_csv("./data/house_train.csv")
df

87. 그룹 지정 및 그룹별 데이터 수 표시

df.groupby(by="YrSold").size()   # 팔린 연도를 중심으로 그룹을 만든 후, 각 그룹별 수를 표시

-> YrSold변수의 각 년도별 데이터 개수 셈 size

88. 그룹 지정 후 원하는 컬럼 표시하기 

df.groupby(by="YrSold")['LotArea'].mean()   # 팔린 연도를 중심으로 그룹을 만들 후, 각 그룹별 주차장의 넓이를 표시.

-> YrSold변수별로 LotAre변수의 평균값 계

*** rank함수 -> 순위구하기 / 동점자 처리방법 / 동점인 값끼리 어떻게 처리하는가

-> average 평균 - 디폴트(기본값) / min 최소값 / max 최대값 / first 처음나온값 / dense 밀도 -> min과 동일하나 그룹간 순위 1씩 증가함 

-> min은 동점자 있을 경우 1등 다음 3등나오지만 dense는 1등 다음 2등으로 표시

 

89. 밀집도 기준으로 순위 부여하기 

df['SalePrice'].rank(method='dense')   # 각 집 값은 밀집도를 기준으로 몇 번째인가

90. 최저 값을 기준으로 순위 부여하기

df['SalePrice'].rank(method='min')    # 각 집 값이 최저 값을 기준으로 몇 번째인가

91. 순위를 비율로 표시하기

df['SalePrice'].rank(pct=True)    # 집 값의 순위를 비율로 표시 (0=가장 싼 집, 1=가장 비싼 집)

92. 동일 순위에 대한 처리 방법 정하기

df['SalePrice'].rank(method='first')   # 순위가 같을 때 순서가 빠른 사람을 상위로 처리하기(먼저 등장한 데이터 상위로)

번외) 값 크기 기준 오름차순 정렬 -> sort_values() / ascending =False->내림차순

df['SalePrice'].sort_values
728x90