: DataFrame을 사용하기 위해서!
: 데이터프레임에서 하나의 열을 떼어낸 형태로, 1차원 구조
: 하나의 정보에 대한 데이터들의 집합
df.shape
: 행과 열의 개수를 튜플로 반환. np.shape과 기능이 같을 뿐, 같은 함수는 아님
df.index
: index 정보 확인
df.values
: 값 확인. np.array 형태의 2차원 값으로 변환
df.columns
: 열 이름 확인
df.dtypes
: 열 정보 확인(열 이름, 각 열의 타입)
df['열이름'].unique()
: 열의 고유값을 볼 수 있음
df.value_counts()
: 범주별 개수를 count해서 반환
df.columns.values.tolist()
: dataframe의 열 이름을 list로 가져옴
`Score['Math'].value_counts()/Score.shape[0]`
# df.shape[0]: shape 함수의 결과값의 첫번째 인덱스, 즉 행의 개수. nan을 포함
# NAN 포함된 건수 비율
`Score['Math'].value_counts()/Score['Math'].count()`
# NAN 제외된 건수 비율
# count : nan은 빼고 카운트 함
df.columns_name = df.columns.values.tolist()
for i in df.columns_name:
print(i, len(df[i].unique()), sep=' ')
df.info()
: 행(인덱스) 개수, 열 개수, 열 이름, non-null 개수, 각 열의 타입df.describe()
: 기초 통계량 확인df.isna().sum()
또는 df.isnull().sum()
: 결측치 세기pd.DataFrame
: 데이터프레임 만들기import pandas as pd
a = {'Name' : ['James', 'Sujin'], 'Score': [90, 100], 'Sex': ['Male', 'Female']}
pd.DataFrame(a)
pd.read_csv()
df.notnull()
: null(na)가 아닌 값을 가져옴df.sort_index(ascending = False)
: 인덱스를 기준으로 정렬df.sort_values(by = ['열 이름', '열 이름'], ascending = [False, True])
: by 에 기준이 되는 열을 넣고, 이 열을 기준으로 정렬df['column명']
: 1차원(시리즈)로 조회df[['column명']]
: 2차원(데이터프레임)으로 조회. column 이름을 list로 입력한 것.df.colimn명
: method처럼 보이므로, 지양하자df.loc[행 조건, 열 이름]
.loc
안 써도 가능은 하지만, 이왕이면 쓰자!a.loc[(a['Score'] > 50) & (a['Sex'] == 'male')]
: 두 열의 특정 조건을 만족하는 행 조회a.loc[:, ['Score', 'Sex']]
: 두 열에 해당하는 모든 행 조회df.loc[df['num_legs'] == 4, ['num_wings']]
: 조건에 만족하는 열 하나 조회df.iloc[행 인덱스, 열 넘버]
: 데이터가 있는 위치(순서)로 접근
df.isin()
: True/False로 반환
Series.between(left, right, inclusive='both')
: left 부터 right까지 범위안의 데이터를 조회
a.loc[data['Age'].between(25, 30)]
a.loc[:9, ['Name', 'Age', 'Sex']]`
# 0:9 면.. 파이썬 슬라이싱에서는 9 전까지지만, 여기서는 9를 포함함!
# 9가 인덱스이기도 하지만 행의 이름이기도 해서.. ㅠ
a.iloc[:10, [0, 11, 12]]`
# :10 면, loc와는 다르게, 10을 포함하지 않음!
# 슬라이싱으로 접근하기 때문에(즉, 데이터 순서로)
# 시리즈로 출력
boston['crim']
boston.loc[:, 'crim']
boston.iloc[:, 0]
# 단, boston.crim 은 method 같아 보이니까 지양하자
# 데이터프레임으로 출력
boston[['crim']]
boston.loc[:, ['crim']]
boston.iloc[:, [0]]
df = pd.DataFrame({'num_legs': [2, 4], 'num_wings': [2, 0]}, index=['falcon', 'dog'])
df
# 출력
num_legs num_wings
falcon 2 2
dog 4 0
# 입력
df.isin([0, 2]) # df를 0, 2에 해당하는걸 True/False로 나타내줘
# 두 열에 해당하는 값을 df에서 찾은 다음 > 0, 2에 해당하하는걸 True/False로 나타내줘
df.loc[:, ['num_legs', 'num_wings']].isin([0,2])
df[['num_legs', 'num_wings']].isin([0,2])
# 출력: True/False로 나옴
num_legs num_wings
falcon True True
dog False True
# 입력
# 두 열에서 0, 2에 해당하는 값을 True/False로 나타낸 다음 > df에서 찾아줘
df[df[['num_legs', 'num_wings']].isin([0,2])]
# 출력: 값으로 나옴
num_legs num_wings
falcon 2.0 2
dog NaN 0
# 에러남: df.loc[df[['num_legs', 'num_wings']].isin([0,2])]
# 입력
df.loc[df['num_legs'].isin([0, 4])]
# 출력
num_legs num_wings
dog 4 0
# 조건이 되는 age를 잘라
data.loc[data['MonthlyIncome'] >= 10000, ['Age']]
# 일단 다 불러온 다음에 그 다음에 age를 잘라
data.loc[data['MonthlyIncome'] >= 10000][['Age']]
# data.loc[data['MonthlyIncome'] >= 10000]가 하나의 데이터 프레임인것.
# 여기서 [['Age']]을 잘라와(데이터 프레임으로)
data.loc[data['MonthlyIncome'] >= 10000]['Age'] # 이건 시리즈로 불러와
df['열 이름'].unique()
: 열의 고유값 확인. ndarray 형태로 반환df.value_counts(dropna = True)
: 고유값과 개수 화인. Series 형태로 반환df.sum()
, df.max()
, df.min()
, df.mean()
, df.median()
, df.count()
df.groupby(by = ['Score', 'Sex'], as_index = True)
: by에 지정된 열로 묶음
이때, 뒤에 mean()이나 sum()과 같은 함수를 안 붙이면, 아무것도 출력되지 않음
만약, '점수'별 '성별'의 '평균'을 알고 싶다면?
: df.groupby(by = 'Score')['Sex'].mean()
: 시리즈로 출력
as_index = True: 집계 기준이 되는 열이 인덱스 열이 됨. default
as_index = False: 행 번호를 기반으로 한 정수값이 인덱스가 됨.
: 실무에서 더 많이 쓰임
: 집계기준이 하나의 열이 되기 때문에, 최소 열이 두개 이상이 되어서 데이터프레임으로 반환됨.
만약, [['Sex']]로 했다면, 데이터프레임으로 출력
df.groupby(['sex', 'pclass'])['survived'].mean().reset_index()
df.groupby(['sex', 'pclass'])[['survived', 'age']].mean()
: 다중 칼럼
df.agg(['함수1', '함수2'..])
: 함수들을 list안에 ''로 묶어서 넣음. 함수들 적용
df.groupby(by = 'Score', as_index = False)['Sex'].agg(['mean', 'sum'])
: ['Sex']로 해도 함수가 두개기 때문에 데이터프레임으로 반환.df.groupby(by = 'Score', as_index = False)['Sex'].agg({'Age': 'mean', 'Time': 'sum'})
: dict으로 지정 가능df.columns = ['Grade', 'Sex_male', 'Study_time']
: 모든 열 이름 변경
df.raname(columns = {'Score': 'Grade', 'Time': 'Study_time'})
: 원하는 열만 이름 변경
df['Money'] = df['Income'] - df['Spend']
: 열 추가
df.insert(1, 'Money', df['Income'] - df['Spend'])
: 원하는 위치에 열 삽입. 그러나.. 실무에서는 열의 위치는 크게 중요하지 않다.
df.drop(['Score' 'Sex'], axis = 1, inplace = True)
: 열 삭제
cat_cols = ['Gender','JobSatisfaction','MaritalStatus','OverTime']
x = pd.get_dummies(x, columns = cat_cols, drop_first = True)
df['Sex'] = df['Sex'].map({'male': 1, 'female': 2})
: 범주형 값을 다른 값으로 변경. 변수에 저장 해줘야함.pd.cut()
: 값 크기를 지정한 개수의 범위로 나누어서 범주값 지정data['Income_Group'] = pd.cut(data['Income'], 4, labels=list('abcd') )
: 4등분pd.merge(df1, df2, how = '방법', on = '열 이름')
: 두 데이터 프레임을 j병합. 데이터프에임 사이에 겹치는 열이 있어야함!!!df1.merge(df2, how = '방법', on = '열 이름')
도 가능pd.concat([df1, df2], axis = 0)
: 단순 합치기. 그냥 가져다 붙임.df['new_column'] = df['column1'].rolling(n, min_periods = m).함수()
: new_column을 추가하여 column1의 n개 데이터에 함수를 적용한 값을 넣는데, 이때 최소 m개 데이터이어도 적용해라.df['new_column'] = df['column1'].shift(n)
: n칸 만큼 민다.# 1. 열을 추가하여 mean을 해서 rolling 해라
# 2행부터 시작. 기준일 포함. NaN: 2개
stock['Close_rolling'] = stock['Close'].rolling(3).mean()
# 2.열을 추가하여, mean을 해서 rolling 하는데, 1칸 아래로 shift 해라
# 3행부터 시작. 기준일 포함하지 않은 꼴이 됨. NaN: 3개
stock['Close_rolling_shift'] = stock['Close'].rolling(3).mean().shift()
# 3. 열을 추가하여 mean을 해서 rolling 하는데, 최소 1개 행이어도 적용해라
# 0행부터 시작. 기준일 포함. NaN: 0개
stock['Close_rolling_min'] = stock['Close'].rolling(3, min_periods=1).mean()
# 4. 열을 추가하여 mean을 해서 rolling 하는데, 최소 1개 행이어도 적용하고, 1칸 아래로 shift 해라
# 1행부터 시작. 기준일 포함하지 않은 꼴이 됨. NaN: 1개
stock['Close_rolling_min_shift'] = stock['Close'].rolling(3, min_periods=1).mean().shift()
pd.crosstab(df['column1'], df['column2'], normalize = False)
: 범주형 변수일 때, 교차표를 만들어줌df['date'] = pd.to_datetime(df['date'])
: 시간을 다루는 자료형으로 변환df['date'].dt.date
: YYYY-MM-DD 형태로(str)df['date'].dt.year
: 연(4자리)df['date'].dt.month
: 월(숫자)df['date'].dt.weekday
: 각 요일을 숫자로. 월=1, 화=2,...df.plot(kind = 'kde')
: 밀도함수 그래프 시각화.df.plot.bar(stacked = True)
: 100% stacked bar charttemp = pd.crosstab(data['열이름1'], data['열이름2'], normalize = 'index')
temp.plot.bar(stacked=True)
plt.show()
df.corr()
: 데이터프레임으로부터 수치형 데이터에 대한 상관계수 구하기df.diff(n)
: n칸 차이나는 데이터 간의 차이 구하기.data['diff1'] = data['sales'].diff()
data['sales'] - data['sales'].shift(1)
data['diff2'] = data['sales'].diff(2)
data['sales'] - data['sales'].shift(2)