import pandas as pd
pd.DataFrame(data = None, index = None, columns = None, dtype = None, copy = False) # DataFrame의 parameter
1) data: list/dictionary/array 등 data type을 인자로 넣음. # parameter명 생략 가능
2) index: 사용자가 원하는 index를 부여할 수 있음(default: range(0, len(data))에 해당하는 index).
3) columns: 컬럼명(즉, 변수명).
4) dtype: DataFrame안에 들어갈 데이터의 type(하나의 데이터는 하나의 dtype만 허용).
5) copy: * 잘 사용하지 않음.
참고) https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html
import pandas as pd
data_list = [['A', 11],['B',22],['C',33]]
df = pd.DataFrame(data_list, columns = ['Name','Num'])
print(df)
Name Num
0 A 11
1 B 22
2 C 33
import pandas as pd
data_list = [['A',11],
['B',22],
['C',33]]
df2 = pd.DataFrame(data_list, index = ['group1', 'group2', 'group3'], columns = ['Name','Num'])
print(df2)
Name Num
group1 A 11
group2 B 22
group3 C 33
data_dic = {'Name' : ['A','B','C'],'Num':[11,22,33]}
df = pd.DataFrame(data_dic, index = ['group1', 'group2', 'group3'])
print(df)
Name Num
0 A 11
1 B 22
2 C 33
import numpy as np
1.3.1.
data_numpy = np.array([['A',11],
['B',22],
['C',33]])
df = pd.DataFrame(data_numpy, columns = ['Name','Num'])
print(df)
Name Num
0 A 11
1 B 22
2 C 33
1.3.2.
data_numpy_1 = np.arange(0, 5)
data_numpy_2 = data_numpy_1 * 3
data_numpy_3 = ['A','B','C','D','E']
df = pd.DataFrame({'column_1' : data_numpy_1,
'column_2' : data_numpy_2,
'column_3' : data_numpy_3})
print(df)
column_1 column_2 column_3
0 0 0 A
1 1 3 B
2 2 6 C
3 3 9 D
4 4 12 E
https://pandas.pydata.org/docs/reference/api/pandas.read_excel.html
pandas.read_excel(io, sheet_name=0, header=0, names=None, index_col=None, usecols=None, squeeze=None, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, parse_dates=False, date_parser=None, thousands=None, decimal='.', comment=None, skipfooter=0, convert_float=None, mangle_dupe_cols=True, storage_options=None)[source]
import pandas as pd; import openpyxl
df = pd.read_excel('df_excel_test.xlsx', engine = 'openpyxl')
df
Name Contents1 Contents2 Memo
0 a 1 1 1
1 b 2 2 2
2 c 3 3 3
3 d 4 4 4
4 e 5 5 5
5 f 6 6 6
6 g 7 7 7
engine = 'openpyxl'없이, read_excel 사용시(.xlsx 파일 호출) 에러 발생.
- XLRDError: Excel xlsx file; not support
2.1.1. sheet_name
2.1.2. header
2.1.3. index_col
2.1.4. usecols
2.1.5. names
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_excel.html
DataFrame.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True, encoding=_NoDefault.no_default, inf_rep='inf', verbose=_NoDefault.no_default, freeze_panes=None, storage_options=None)
df.to_excel('df_excel_test_output.xlsx')
2.2.1. sheet_name
2.2.2. index
2.2.3. header
#dataframe을 2개 만들고 각각의 dataframe을 각각의 sheet에 저장
with pd.ExcelWriter('df_excel_test_output1.xlsx') as writer:
df1.to_excel(writer, sheet_name='sheet1')
df2.to_excel(writer, sheet_name='sheet2')
#특정 조건에 따라 저장될 sheet 구분.
aa = (df['변경할 column명_1'] == 'a') | (df['변경할 column명_1'] == 'b') | (df['변경할 column명_1'] == 'c') | (df['변경할 column명_1'] == 'd')
bb = (df['변경할 column명_1'] == 'e') | (df['변경할 column명_1'] == 'f') | (df['변경할 column명_1'] == 'g')
with pd.ExcelWriter('df_excel_test_output2.xlsx') as writer:
df[aa].to_excel(writer, sheet_name='a부터 d까지')
df[bb].to_excel(writer, sheet_name='e부터 g까지')
#참고) 여러 조건을 함께 사용할 때에는 괄호( )안에 각각의 조건을 넣어주어야 함.
input_name = input('파일명 입력: ')
df2 = pd.read_csv(input_name+'.txt',sep="\t",encoding='ANSI'); print(df2)
df2.to_excel(input_name+'.xlsx',index=False)
df.columns #column명 전체 조회
방법1) 기존 column명 순서에 맞춰 변경할 column명을 list 타입으로 넣어줌.
df.columns = ['change_1', 'change_2', 'change_3']
방법2) rename() 함수 활용.
df.rename(columns = {'기존 column명' : '변경할 column명'}) # 1:1
df.rename(columns = {'기존 column명_1' : '변경할 column명_1', # 3:3
'기존 column명_2' : '변경할 column명_2',
'기존 column명_3' : '변경할 column명_3'}, inplace=True)
1) 변경할 순서에 맞춰 column명 배치.
df = df[['Type', 'Rank', 'ID']]
2) reindex()함수 활용.
df = df.reindex(columns=['변경할 column명_2', '변경할 column명_3', '변경할 column명_1'])
pd.concat()
pd.concat([df1, df2]) #세로로 병합(axis = 0; default)
pd.concat([df1, df2], axis=1) #가로로 병합
https://seong6496.tistory.com/73
np.zeros([7, 1]) # 7x1으로 구성된 값 생성
df['칼럼명'] = np.zeros([7, 1]) #생성되어 있는 데이터프레임에 '칼럼명'이란 column 생성하고, 7x1 만큼 0으로 구성된 값 추가
https://rfriend.tistory.com/460
https://computer-science-student.tistory.com/375
https://kimdingko-world.tistory.com/206
.loc(row index, 'column label')
.iloc(row index, column index)
column label(loc) 또는 column index(iloc)는 생략되어도 되는데 row index(loc/lioc)는 생략되면 안됨(' : '로 공란이라도 넣어주어야 함).
.loc가 boolen array값을 통해 데이터에 접근한다는 점을 활용하여, 특정 조건에 맞는 cell에 접근.
경우1) 대/소 관계 활용.
경우2) isin() 활용.
iloc로 특정행에 접근 + 해당 행/열에 특정 값 넣어주기
# # iloc을 사용하여 값에 접근할 때는 값을 변경할 수 없음. 대신 iloc을 사용하여 위치를 선택한 후, .at이나 .iat을 사용하여 해당 위치의 값을 변경
if df_work.iloc[nn]['ATTRIBUTE'] == '내용':
df_work.at[nn, 'ID'] = df_domain.iloc[n]['ID']
df_work.at[nn, 'A_Key'] = e
df_work.at[nn, 'Q_format'] = M_MP_T_1_1
http://net-informations.com/ds/err/length.htm
df.max(axis = 1, numeric_only = True) #axis = 1은 행 기준, default: axis = 0 (열기준)
https://jimmy-ai.tistory.com/254
중복 데이터가 있는지 탐색(중복되는 row를 탐색).
df.duplicated()
중복 데이터 삭제(중족되는 row를 기준으로).
df.drop_duplicates()
.duplicated()와 drop_duplicates()는 row를 기준으로 한다. column을 기준으로 중복값을 찾고 삭제하려면 dataframe의 형태를 바꿔주어야 한다.
중복 데이터가 있는지 탐색(중복되는 column을 탐색).
df.T.duplicated()
중복 데이터 삭제(중복되는 column을 기준으로).
df.T.drop_duplicates()
중복되는 column 삭제 후, 원래 형태로 변형.
df.T.drop_duplicates().T
https://www.statology.org/pandas-drop-duplicate-columns/
결측값이 있는지 탐색.
결측치 삭제 방법.
1) 결측값이 있는 row(또는 column) 삭제.
df.dropna(axis = 0) # row 기준, 결측치가 있는 cell의 row 전체를 삭제.
df.dropna(axis = 1) # column 기준, 결측치가 있는 cell의 column 전체를 삭제.
df.dropna(how = 'all') # row 기준, row에 포함된 cell이 전부 결측값일 경우 해당 행을 삭제.
df.dropna(thresh = n) # row 기준, row에 포함된 n개 이상의 cell이 결측값일 경우 해당 행을 삭제.
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.dropna.html
2) 결측값 위치에 새로운 값을 넣어줌.
df.fillna(n) # 결측치(NaN)를 특정 값(n)으로 채워줌.
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.fillna.html
3) index를 활용한 삭제
Remove rows or columns by specifying label names and corresponding axis, or by specifying directly index or column names. When using a multi-index, labels on different levels can be removed by specifying the level.
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop.html
** 특정 값이 결측값(nan)인지 확인하는 방법,
import pandas as pd
# 변수 a가 NaN인지 확인
if pd.isna(a):
print('결측값')
예) df['사이트명']에는 '네이버뉴스', '다음뉴스', '네이트뉴스'가 있음.
only_naver = df['사이트명'] == '네이버뉴스'
df_naver = df[only_naver]
DataFrame에 수정 명령줄 시, pandas가 warning 메시지 보냄
import pandas as pd
pd.set_option('mode.chained_assignment', None) # 경고 off