EDA 테스트를 해보며 자주 나오는 코딩 문법 복습하기!!!
source =
[{'매장명': '용마로주유소',
'주소': '서울 중랑구 용마산로 309 (면목동)',
'브랜드': 'SK에너지',
'휘발유 가격': '1,798',
'경유 가격': '1,698',
'셀프 여부': 'Y',
'세차장 여부': 'Y',
'충전소 여부': 'N',
'경정비 여부': 'N',
'편의점 여부': 'N',
'24시간 운영 여부': 'N',
'구': '중랑구'},
{'매장명': '범아주유소',
'주소': '서울 중랑구 동일로 881 (묵동)',
'브랜드': 'S-OIL',
'휘발유 가격': '1,859',
'경유 가격': '1,739',
'셀프 여부': 'N',
'세차장 여부': 'Y',
'충전소 여부': 'N',
'경정비 여부': 'Y',
'편의점 여부': 'N',
'24시간 운영 여부': 'N',
'구': '중랑구'}]
df=pd.DataFrame(source)
git_address="http://~~~" #따옴표 중요
df=pd.read_excel(git_address)
# 리스트를 튜플로 만들기 (zip),
list1=['a','b','c']
list2=[1,2,3]
pairs =[pair for pair in zip(list1,list2)]
paris
out>>
[('a',1),('b',2),('c',3)]
#튜플을 딕셔너리로
dict(pairs)
out>>
{'a':1,'b':2,'c':3 }
#언팩킹
x,y =zip(*pairs)
x
out>>
('a','b','c')
print(list(y))
out>>
[1,2,3]
source={'country': ['a', 'b', 'c', 'e', 'e'],'person': [11, 22, 3, 23, 9],'zero': [0, 0, 0, 0, 0]}
df_temp=pd.DataFrame(source)
df_temp
'country': ['a', 'b', 'c', 'e', 'e']}
import pandas as pd
#파일 불러오기
data = pd.read_csv('주소/파일.csv', encoding='')
#파일 확인하기
data.head()
import pandas as pd
pd.read_html(URL, match='.+', flavor=None, header=None, index_col=None, skiprows=None, attrs=None, parse_dates=False, tupleize_cols=None, thousands=', ', encoding=None, decimal='.', converters=None, na_values=None, keep_default_na=True, displayed_only=True)
- df[‘ColumnName’]
- df.ColumnName
- df[[‘ColumnName’, 'ColumnName']]
리스트에 리스트 형식
df.loc[행 인덱싱 값, 열 인덱싱 값 ]
- Location 약자
# 예시
df.loc[0] : 0번째 행변경 (딕셔너리)
df.loc[0,'Name'] : 0번째 행, Name 열
df.loc[:,'Name'] : 전체 행, Name 열
df.loc[:4,:'Name'] : 처음행부터 4까지, 처음열부터 Name 열
df.loc[[1,2,5],['Name','Address']] : 1,2,5행 + Name, Address 열
# 예시 : age 컬럼에서 3인 값들 추출하기
cond1=df['age'] == 1
df.loc[cond1]
# 예시 : age 컬럼에서 3인 값들 추출하기 + class가 30인 값 추출하기
df.loc[(df['age'] == 1) | (df['class가'] == 30)]
# 멀티 인덱스일 경우_아래 이미지
df_target.loc[('서울시', '합계', '발생건수'),열]
df.iloc[행 인덱싱값, 열 인덱싱 값]
# 예시
df.iloc[2] #0부터 시작해서 0>1>2 번째 줄
df.iloc[3:7] #0>1>2>3 번째 ~ 6번째 줄
df.iloc[:7] #처음부터 ~ 6번째 줄
df.iloc[:-7] #마지막에서부터 ~ 6번째까지
- df[df['ColumnName']조건]
- df[df.ColumnName 조건]
데이터 프레임에 데이터 프레임
# 예시 : age 컬럼이 30 이상인 행을 가져오고 싶다면
df[df['age']>=30]
df[df.age>=30]
# 예시 : name이 ‘Clara Oswald’가 아닌 경우만 선택하고 싶다면
df[df['name'] != 'Clara Oswald']
df[df.name != 'Clara Oswald']
아래 코드에서 이 부분 로직 잘 확인하기 : df.loc[df.index == index, 'country'] == country
df={'country': ['a', 'b', 'c', 'e', 'e']},'person': [11, 22, 3, 23, 9]},'zero': [0, 0, 0, 0 0]}
#(인덱스,'country'컬럼 변경 내용)
df_change_list = [
(1, 'A'),
(3, 'C'),
(4, 'E'),
]
for index, country in df_change_list:
df.loc[df.index == index, 'country'] = country
df.columns=[]
df.rename(columns={'기존 이름' : '바뀔 이름'})
data={
"name" : a,
"age" : b,
"height" : c,
"sex" : d
}
혹은
df.columns = ['name', 'age', 'height', 'sex']
------------------------------------------------------------
#1
df[['name', 'sex', 'age', 'height']]
#2
df=pd.DataFrame(data, columns=["name","sex","age","height"])
df
# **3
new_order_column=['name', 'sex', 'age', 'height']
df[new_order_column]
아래 코드에서 이 부분 로직 잘 확인하기 : items() / df.loc[df["Column"]==old_name, "Column"] : [행,열]
#컬럼명 주어짐
old_to_new_value = {
'Old_1': 'New_1',
'Old_2': 'New_2',
'Old_3': 'New_3',}
for old_name, new_name in old_to_new_value.items():
df.loc[df["Column"]==old_name, "Column"] = new_name
df1 = df.astype({'col1':'int32'})
df1 = df.astype({'col1':'int32', 'col3':'int64'})
print(df1.dtypes)
columns_to_convert = ['col1', 'col2', 'col3']
df1[columns_to_convert] = df1[columns_to_convert].astype(float)
df1= df.astype(dtype='int64',errors='ignore')
#errors = int64로 변경할 수 없는건 무시
print(df1.dtypes)
#특정 단어를 포함하고 있는 열을 제외한 데이터프레임으로 설정
df = df[~df['column'].str.contains('특정 단어')]
예시) df의 A 컬럼에서 str 타입을 공백으로 나눈다
df.컬럼명.str.split(' ')[0]
예시) df의 A 컬럼에서 str 타입을 공백으로 나눈 것에서 str타입 [0]번째 호출
df.['A'].str.split(' ').str[0]
# 같은 문법
for id, row in df.iterrows():
df.loc[id, 'A'] = row['A'].split(' ')[0]
-----
df['A'] = df['A'].str.split(' ').str[0]
for i, row in df_practice.iterrows():
df_practice['구분']=df_practice['구분'].str.split(' ')[i][0]
#위와 동일한 코드
df_practice['구분'] = df_practice['구분'].apply(lambda x: x.split(' ')[0])
s = " Hello "
print(s.strip()) # 출력: "Hello"
s = "----Hello----"
print(s.strip('-')) # 출력: "Hello"
df['컬럼명']=df['컬럼명'].str.strip()
'리스트' 사용
axis=1 : 열(coulumn)
drop_col = ['A','C','F']
df=df.drop(drop_col,axis=1)
source = {'country': ['a', 'b', 'c', 'e', 'e'],
'person': [11, 3, 3, 23, 5],
'zero': [0, 0, 0, 0, 0]}
# 'country'컬럼에서 'b'인 행 지우기
idx = source[source['country'] == "b"].index
source.drop(idx , inplace=True)
# 더 심플한 방법 : 'country'컬럼에서 'b'가 아닌 행 찾기
DF = source[source.country != 'b']
df.drop_duplicates()
파라미터 | 기능 |
---|---|
keep | first : 첫번째만 남기고 이후 중복값 제거, default= first last : 마지막만 남기고 이전 중복값 제거 |
inplace | default = False, df 변경 여부 |
ignore_index | default = False, 인덱스 재설정 여부 |
subset | 중복 데이터를 처리할 열 |
df_result = df_result.droplevel(level=2)
df.sort_values(by='A', ascending=False)
df.sort_values(by=['A', 'B'], ascending=[True, True])
type_list = ['합계', '차대사람', '차대차', '차량단독', '건널목']
category_type = pd.CategoricalDtype(categories=type_list, ordered=True)
gu_list = ['서울시', '종로구', '중구', '용산구', '성동구]
df=df.reindex(index=gu_list, level=1)
# 두번째 인덱스 줄을 gu_list 순서대로 배열
함수 | 기능 |
---|---|
count | 데이터의 개수 |
sum | 합계 |
mean | 평균 |
median | 중앙값 |
var, std | 분산, 표준편차 |
min, max | 최소, 최대값 |
unique, nunique | 고유값, 고유값 개수 |
prod | 곱 |
first, last | 첫째, 마지막값 |
df.groupby('컬럼명').집계함수()
#예시
df.groupby('age').var()
df.groupby('age').agg(['mean', 'var'])
city_list = ['서울', '부산', '대전', '광주']
cat_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
type_list = ['가', '나', '다', '라', '마', '-']
# 리스트 항목별로 순서 매기기
sorterIndex_city = dict(zip(gu_list, range(len(gu_list))))
sorterIndex_type = dict(zip(type_list, range(len(type_list))))
sorterIndex_cat = dict(zip(cat_list, range(len(cat_list))))
# 순서를 위한 임시 컬럼 만들기
df['도시순서'] = df['도시'].map(sorterIndex_city)
df['유형순서'] = df['유형'].map(sorterIndex_type)
df['구분'] = df['구분'].map(sorterIndex_cat)
#'도시순서'가 같으면 '유형순서, '유형순서'가 같으면 '구분순서'순으로 배열
df.sort_values(['도시순서','유형순서','구분순서'],inplace=)
# 임시 컬럼 삭제하기
df.drop(['도시순서','유형순서','구분순서'],axis=1,inplace=True)
import pandas as pd
# 기준열 이름이 같을 때
pd.merge(left, right, on = '기준열', how = '조인방식')
# 기준열 이름이 다를 때
pd.merge(left, right, left_on = '왼쪽 열', right_on = '오른쪽 열', how = '조인방식')
on
: (두 데이터프레임의 기준열 이름이 같을 때) 기준열
하지만 양쪽 데이터프레임에서 기준이 되는 열의 이름이 다르다면 각각 left_on = '왼쪽 열', right_on = '오른쪽 열'로 지정하면 된다.
how
: 조인 방식 {'left', 'right', 'inner', 'outer'} 기본값은 'inner'
asix=0
: 행단위로 아래에 붙여넣기asix=1
: 열단위로 옆에 붙여넣기df.isnull()
df[df['A'].isnull()]
df[(df['A'].isnull()) | (df['C'].isnull())]
df.isnull().sum()
# 결과
A 2
B 1
C 3
dtype: int64
#특정 열에 있는지 여부 체크
df['A'].isnull().sum()
df.notnull()
df[df['A'].notnull()]
df[(df['A'].notnull()) | (df['C'].notnull())]
df. notnull().sum()
# 결과
A 4
B 5
C 3
dtype: int64
df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
파라미터 | 기능 |
---|---|
value | 결측값을 대체할 값, dict 형태도 가능 |
method | 결측값을 변경할 방식 bfill : 결측값 바로 아래 값과 동일하게 ffill : 결측값 바로 위값과 동일하게 |
axis | {0 : index / 1 : columns} fillna 메서드를 적용할 레이블 |
inplace | 원본 변경 여부 |
limit | 변경활 회수, 위에서부터 지정된 갯수만 변경 |
downcast | downcast='infer'일 경우 float64를 int64로 변경 |
df.set_index('id')
df.set_index(['id', 'name'])
df.index.get_level_values(0)
DataFrame.reset_index(level=None, drop=False,
inplace=False, col_level=0, col_fill='')
df=df.groupby('Country').count()
df=df.sort_values(by='Year', ascending=False)
df=df.head(10) # 상위 10개
df=df.reset_index()
dropList=['Month','Day','Region','city','latitude','longitude','Type']
df=df.drop(dropList,axis=1)
dropList = ['Month', 'Day', 'Region', 'city', 'latitude', 'longitude', 'Type']
df = (
df.groupby('Country').count()
.sort_values(by='Year', ascending=False)
.head(10)
.reset_index()
.drop(columns=dropList)
)
[pandas] 2-1. loc와 iloc 차이와 사용방법
[pandas] 열 또는 행 선택하기
[Pandas] 파이썬 결측치 확인 방법 : isnull, notnull
[Python/파이썬] Pandas Dataframe 결합 : Merge
[Pandas] 데이터프레임 정렬하기 : sort_values, sort_index 함수
[파이썬 pandas] 데이터프레임 컬럼 순서 변경, 추가, 이름 바꾸기
[파이썬] 7. 판다스 - 특정 조건 만족하는 행 삭제하기|작성자 러닝머신
[Python] 데이터프레임 합치기 :: pd.merge()
02. 데이터 프레임 결합하기
판다스(Pandas) .groupby()로 할 수 있는 거의 모든 것! (통계량, 전처리)