다른 명령
Pandas,DataFrame 생성, 추가, 삭제, 조회, 메타 등
데이터프레임 개체 생성(create)
- Table이나 Sheet형식이 데이터 저장 개체
- indext와 여러 column으로 구성
# -*- coding: utf-8 -*- from pandas import Series, DataFrame import numpy as np
기본 데이터프레임 생성
df = DataFrame([1000, 2000, 3000, 4000]) print df df = DataFrame([1000, 2000, 3000, 4000], index=["i1", "i2", "i3", "i4"]) print df df = DataFrame({"c1":[1000, 2000, 3000, 4000]}, index=["i1", "i2", "i3", "i4"]) print df print("-" * 100 + "{[1]}") # ----- #
여러 컬럼 데이터프레임 생성
df2 = DataFrame({"c1":[1,2,3], "c2":[11,22,33], "c3":[111,222,333]}) print df2 df2 = DataFrame({"c1":[1,2,3], "c2":[11,22,33], "c3":[111,222,333]}, index=["i1","i2","i3"]) print df2 print("-" * 100 + "{[2]}") # ----- #
컬럼만 있는 데이터프레임 생성
df4 = DataFrame(columns=("lib","qt1","qt2")) print df4 for i in range(5): df4.loc[i] = [(i+1)*(n+1) for n in range(3)] print df4 print("-" * 100 + "{[3]}") # ----- #
난수를 이용한 데이터프레임 생성
df3 = DataFrame(np.random.randn(6,3)) print df3 print("-" * 100 + "{[4]}") # ----- #
리스트로 데이터프레임으로 생성
lst1 = [1,2,3,4] df = DataFrame(lst1) print df lst2 = [[1,2,3,4,5], ["a", "b","c","d","e"]] df = DataFrame(lst2) print df print("-" * 100 + "{[5]}") # ----- #
딕셔너리(Dictionary)로 데이터프레임으로 생성
data = {'name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'], 'year': [2012, 2012, 2013, 2014, 2014], 'reports': [4, 24, 31, 2, 3], 'coverage': [25, 94, 57, 62, 70]} df0 = DataFrame(data, index=['Cochice', 'Pima', 'Santa Cruz', 'Maricopa', 'Yuma']) print df0 print("-" * 100 + "{[5.5]}") # ----- #
데이터프레임 개체 수정(alter)
df = DataFrame([1000, 2000, 3000, 4000]) df2 = DataFrame({"x1":[1,2,3], "x2":[11,22,33], "x3":[111,222,333]}) df3 = DataFrame({"c1":[1,2,3], "c2":[11,22,33], "c3":[111,222,333]}, index=["i1","i2","i3"])
컬럼명 변경
df.columns = ["C1"] print df df2.columns = ["c1", "c2", "c3"] print df2 df2.rename(columns={"c1":"CC1"}, inplace = True) # 많이 쓰임!!! print df2 print("-" * 100 + "{[6]}") # ----- # df.columns.values[0] = 999 # 컬럼명이 숫자일 땐 숫자로.. print df df3.columns.values[0] = "ttt" # 컬럼명이 문자일 땐 문자로.. print df3
컬럼명 변경2
df8 = pd.DataFrame({"c1":[1,2,3], "c2":[11,22,33], "c3":[111,222,333]}, index=["i1","i2","i3"]) df8.columns.values[0] = "id_area8" print df8 df8.rename(columns={df8.columns[0]:"id_area7"}, inplace = True) print df8
컬럼 추가 : 값 지정
df["newC2"] = 5 print df df["newC3"] = ["a","b","c","d"] print df
컬럼 추가 : Boolean 조건 지정
df2["new9"] = df2["c3"] > 300 print df2 print("-" * 100 + "{[7]}")
컬럼 추가 : 다른 column을 계산하여 생성
df2["newC9"] = df2["c2"] + df2["c3"] print df2 print("-" * 100 + "{[8]}") # ----- #
컬럼 추가 : 시리즈로 추가
df9 = DataFrame([1000, 2000, 3000, 4000], index=["i1", "i2", "i3", "i4"]) print df9 add_srs = Series([1001, 2001, 3001, 4001], index = ["i1","i2","i3","i4"]) print add_srs df9["c3"] = add_srs print df9 add_srs = Series([1011, 3011, 4011], index = ["i3","i4","i5"]) # "i5"는 반영 안됨(outer join 방식) df9["c4"] = add_srs print df9 print("-" * 100 + "{[9]}") # ----- #
컬럼 추가 : 리스트로 추가(가장 편할 듯!!!)
add_lst = [1111,2222,3333,4444] df9["c5"] = add_lst print("-" * 100 + "{[10]}") # ----- #
컬럼 추가 : 빈 데이터프레임에 컬럼 추가(인덱스 포함)
df22 = DataFrame() dd22 = df22.append({"c1":"", "c2":"", "c3":""}, ignore_index=True) print df22
컬럼 추가 : 빈 데이터프레임에 컬럼 추가(인덱스 제외)
df33 = pd.DataFrame(columns=("c1", "c2", "c3") print df33 print("-" * 100 + "{[10.3]}") # ----- #
컬럼 삭제
df2 = DataFrame({"x1":[1,2,3], "x2":[11,22,33], "x3":[111,222,333]}) df3 = DataFrame({"c1":[1,2,3], "c2":[11,22,33], "c3":[111,222,333]}, index=["i1","i2","i3"]) del df2["x2"] print df df2 = df2.drop("x1", 1) print df2 df3 = df3.drop(["c2", "c3"], 1) print df3 print("-" * 100 + "{[11]}") # ----- #
인덱스 컬럼명 변경
df2.index.name = "Count" print df2.index print df2
데이터프레임 개체 속성 조회 및 변경(meta)
df = DataFrame([1000, 2000, 3000, 4000], index=["i1","i2","i3","i4"]) df2 = DataFrame({"c1":[1,2,3], "c2":[11,22,33], "c3":[111,222,333]}, index=["i1","i2","i3"])
컬럼 이름 리턴
print df2.columns.values
인덱스 이름 리턴
print df2.index
기타 속성 리턴
print df2.shape[0] # 행 개수 : for문 range에 활용 print df2.shape[1] # 열 개수 print df2.size # 행 * 열 개수 print df2.ndim # 뭔지 모름? print df2.info() # DF정보 print df2.describe() # DF 일괄 통계 정보 추출 print("-" * 100 + "{[12]}") # ----- #
개체 타입 확인
print type(df.ix["i1"]) # 결과 : pandas.core.series.Series print type(df.ix[1:3, 0:2]) # 결과 : pandas.core.frame.DataFrame print("-" * 100 + "{[12.5]}") # ----- #
데이터프레임 데이터 조회(select)
df = DataFrame([1000, 2000, 3000, 4000], index=["i1","i2","i3","i4"]) df2 = DataFrame({"c1":[1,2,3], "c2":[11,22,33], "c3":[111,222,333]}, index=["i1","i2","i3"])
원하는 컬럼만 출력
newColList = [0,1] print df2[newColList]
데이터 추출 : 컬럼단위
print df2[["c1","c3"]] print df2[["c2"]] # 인덱스와 컬럼명까지 출력 print df2["c2"] # 인덱스만 출력 print("-" * 100 + "{[13]}") # ----- #
데이터 추출 : 행단위
print df2.iat[0,0] print df2.at["i1","c1"] print df2.loc["i2"] print df2.loc["i2"]["c1"] print df2.iloc[0,0:3] print("-" * 100 + "{[14]}") # ----- #
데이터 추출 : 부분
print df2.ix[0,0] print df2.ix[1:3, 0:2] print df2.ix["i1":"i2", "c2":"c3"] print df2.ix[:,["c2", "c3"]] print df2.ix[["i2","i3"], :] print("-" * 100 + "{[15]}") # ----- #
데이터 추출 : 아래 3개 동일
print df2[0:2] print df2.ix[0:2] print df2.ix[0:2, :] print("-" * 100 + "{[16]}") # ----- #
데이터 추출 : 조건 처리
df2["c4"] = df2["c3"] > 300 print df2 print("-" * 100 + "{[17]}") # ----- #
데이터프레임 데이터 변경(update, delete, insert)
df2 = DataFrame({"c1":[1,2,3], "c2":[11,22,33], "c3":[111,222,333]}, index=["i1","i2","i3"])
컬럼값 전체 변경
df2["c3"] = df2["c1"] + df2["c2"] print df2 df2["c3"] = 111 print df2 print("-" * 100 + "{[18]}") # ----- #
컬럼 추가 후 데이터 입력
df2["newC4"] = ["a","b","c"] print df2
컬럼 데이터 수정
df2["newC4"] = [111,222,333] print df2 df2.ix[1,2] = 2000 print df print("-" * 100 + "{[19]}") # ----- #
행 추가
rows = [4, 44, 444, "d"] df2.loc[len(df2)] = rows print df2 df2 = df2.rename(index={3:"i4"}) print df2
행 추가 : 빈 데이터프레임에 행 추가(인덱스 포함)
df22 = DataFrame() dd22 = df22.append({"c1":"", "c2":"", "c3":""}, ignore_index=True) df22.ix[0, "c1"] = "111" df22.ix[0, "c2"] = "222" df22.ix[0, "c3"] = "333" print df22
행 추가 : 빈 데이터프레임에 행 추가(인덱스 제외)
df33 = pd.DataFrame(columns=("c1", "c2", "c3")) df33.loc[0] = [ "111", "222", "333"] print df33
행 삭제
df2 = df2.drop("i2", axis = 0) print df2 print("-" * 100 + "{[20]}") # ----- #
데이터프레임 출력 변환
print df2.T # 피벗 print df2.values # array로 받음 print df2.shape # 행렬(Array) 형태 출력 print("-" * 100 + "{[21]}") # ----- #
인덱싱(index, reindex)
df = DataFrame({"c1":[1,2,3], "c2":[11,22,33], "c3":[111,222,333]}, index=["i1","i2","i3"]) print df df = df.reindex(["i1", "i2", "i3", "i4", "i5"]) print df print("-" * 100 + "{[22]}") # ----- # df = df.reindex(["i1", "i2", "i3", "i4", "i5"]).interpolate() # 보간법 print df df["interPo"] = df["c1"].interpolate() print df print("-" * 100 + "{[23]}") # ----- #
중복 인덱싱
df = df.reindex(["i1", "i2", "i4", "i4", "i5"]) print df print df.index.is_unique # 인덱스가 unique이면 True 리턴 print df.ix["i4"] print("-" * 100 + "{[24]}") # ----- #
인덱스 컬럼명 변경
df7 = DataFrame({"c1":[1,2,3], "c2":[11,22,33], "c3":[111,222,333]}, index=["i1","i2","i3"]) df7.index.name = "id_area9" print("-" * 100 + "{[24.5]}") # ----- #
기존 컬럼을 인덱스로 변경
df33 = DataFrame({"c1":[1,2], "c2":[11,22]}, index=["i1", "i2"] print df33 df33.index.name = "idx" print df33 df33 = df33.set_index("c1") print df33
정렬(sort_index, sort_values)
df = DataFrame({"c2":[10,40,70], "c3":[50,20,20], "c1":[60,30,90]}, index=["i2","i1","i3"]) print df
정렬 : 인덱스 기준
print df.sort_index() # 인덱스명으로 정렬 print df.sort_index(axis=0) # 인덱스(?)로 정렬 print df.sort_index(axis=1) # 컬럼명(?)으로 정렬 print df.sort_index(axis=0, ascending = False) # descending print("-" * 100 + "{[25]}") # ----- # df2 = df.sort_index(axis = 0) df3 = df2.sort_index(axis = 1) print df3 print("-" * 100 + "{[26]}") # ----- #
정렬 : 컬럼 기준
print df.sort_values(by = "c1") print df.sort_values(by = "c1", ascending=False) print df.sort_values(by = ["c3","c2"]) print("-" * 100 + "{[27]}") # ----- #
NULL 처리(NaN, NA, NULL)
from numpy import nan as NA df = DataFrame(np.random.randn(7,3)) print df
강제로 NA 추가
df.ix[2,1] = NA df.ix[3,2] = NA print df
NaN 변경(null if)
df.replace(np.NaN, 'NULL Value', inplace=True) #df.column_nm.replace(np.NaN, 'NULL Value', inplace=True) print("-" * 100 + "{[28]}") # ----- #
랭킹 및 집계처리(lambda, apply)
data = {'name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'], 'year': [2012, 2012, 2013, 2014, 2014], 'reports': [4, 24, 31, 2, 3], 'coverage': [25, 94, 57, 62, 70]} df = DataFrame(data, index=['Cochice', 'Pima', 'Santa Cruz', 'Maricopa', 'Yuma']) print df print("-" * 100 + "{[29]}") # ----- # # -- 랭킹 # print df.rank(method="first") # 에러나는데.. 무슨 numeric일때만? print df.rank(axis=0) # 행단위로 순위 print df.rank(axis=1) # 컬럼단위로 순위 print df.rank(ascending=False, method="max") print("-" * 100 + "{[30]}") # ----- # #-- 랭킹 : 한 컬럼으로 순위 선정 df['coverageRanked'] = df['coverage'].rank(ascending=1) print df print("-" * 100 + "{[31]}") # ----- #
lambda를 이용한 apply함수 사용
# 행이나 열에서의 max() - min() 활용 df = DataFrame({"c1":[20,30,90], "c2":[30,30,80], "c3":[100,40,50]}, index=["i1","i2","i3"]) print df print df.apply(lambda x:x.max() - x.min(), axis = 0) # 행간 계산 df["newC4"] = df.apply(lambda x:x.max() - x.min(), axis = 1) # 컬럼간 계산 print df print df.apply(lambda x:x+1) # 행/컬럼 모두
Pandas Numpy 사용법
numpy : 배열 구조 및 연산
import numpy as np
난수를 통한 배열 생성
data = np.random.randn(2,3) print(data) print("-"*100) # ---------------------------
리스트를 통한 배열 생성
data1 = [6,7,5,8,0,1] print(data1) arr1 = np.array(data1) print(arr1)
2차원 리스트를 통한 배열 생성
data2 = [[1,2,3,4],[5,6,7,8]] arr2 = np.array(data2) print(arr2) print("-"*100) # ---------------------------
array 구조 출력
print(arr2.shape)
0으로 채워진 배열 생성
print(np.zeros((2,3)))
순번으로 채워진 배열 생성
print(np.arange(15)) print("-"*100) # ---------------------------
다차원 배열 생성 및 계산
arr = np.array([[1,2,3],[4,5,6]]) print(arr) print(arr+arr) print(arr*arr) print("-"*100) # ---------------------------
n차 배열
-- 다차원 배열 생성 및 조회 arr2d = np.array([[11,12,13],[14,15,16],[17,18,19]]) print(arr2d) print(arr2d[1]) print(arr2d[1][2]) print(arr2d[:2, 1:]) print("-"*100) # ---------------------------
불리언 색인(Boolean Index)
names = np.array(["Bob", "Joe", "Will", "Bob", "Will", "Joe", "Joe"]) data = np.random.randn(7,4) print(names) print(data)
조건에 맞는지 boolean 리턴
print(names == "Bob") print("-"*100) # ---------------------------
두 배열을 조합한 조회
print(data[names=="Bob"]) # Bob이 있는 행 print(data[names=="Bob",0]) # Bob이 있는 행의 0번째 열 print("-"*100) # ---------------------------
배열의 OR 조건 Boolean 조회
mask = (names=="Bob") | (names=="Will") print(mask)
조건에 따라 배열 값 변경 조회
data[data<0] = 0 print(data) data[names!="Joe"] = 7 print(data) print("-"*100) # ---------------------------
피벗팅 및 배열 재조합
-- 피벗팅 arr = np.arange(15).reshape((3,5)) print(arr) print(arr.T) print("-"*100) # --------------------------- -- 재조합 aaa = np.arange(16) print aaa arr = np.arange(16).reshape(2,2,4) print(arr) # -- 피벗팅 arr2 = arr.swapaxes(1,2) print arr2
배열 조회 조건 및 집계
arr = np.random.randn(4,4) print(arr) print(np.where(arr>0,1,-1)) print(arr) print("-"*100) # --------------------------- # -- where를 이용한 조건 조회 print(np.where((0<arr) & (arr<10), 2, -2)) print(np.where(np.logical_and(arr>0, arr<10), 3, -3)) print(np.where((0<arr) & (arr<10), arr, -4)) print("-"*100) # --------------------------- # -- 배열 집계 print(arr.mean()) print(np.mean(arr)) print(arr.sum()) print(arr.cumsum()) print(arr.min()) print(arr.max()) print("-"*100) # ---------------------------
정렬 및 중복제거
arr = np.random.randn(5,3) print(arr) # -- 정렬 arr.sort(1) # 행 단위로 정렬 print(arr) # -- 중복제거 names = np.array(["Bob", "Joe", "Will", "Bob", "Will", "Joe", "Joe"]) print(np.unique(names)) # 중복제거 print(len(np.unique(names))) # 중복제거 개수 print(set(names)) # 뭐지? print(np.unique(names)[1]) # 또 뭐더라? print("-"*100) # ---------------------------
선형대수(행렬 연산)
x = np.array([[1,2,3],[4,5,6]]) y = np.array([[6,3],[-1,7],[8,9]]) print(x) print(y) # -- 행렬 곱하기? print(x.dot(y)) # print(x*y)는 에러발생 print("-"*100) # --------------------------- -- ? from numpy.linalg import inv, qr x = np.random.randn(5,5) mat = x.T.dot(x) print(inv(mat)) print(mat.dot(inv(mat)))
난수 생성
samples = np.random.normal(size =(3,4)) print(samples) samples = np.random.normal(size =(2,2)) print(samples) data = np.random.randn(2,2) print(data)
For 문을 사용한 List,Dictionary 출력
import pandas as pd
리스트의 index, value 출력
lst = ["AAA", "BBB", "", "DDD"] for index in range(len(lst)): print(index, lst[index]) print("... 리스트 index, value 출력[range(len()) 사용]", "." * 100, "\n") for idx, val in enumerate(lst): print(idx, val) print("... 리스트 index, value 출력[enumerate() 사용]", "." * 100, "\n") for index in lst: print(index) print("... 리스트 출력", "." * 100, "\n")
list-in-list에서의 중복제거
oldlist = [['a', 'b', 'a'], ['a', 'p', 'f', 'b'], ['b', 's', 'r']] newlist = list() for sublist in oldlist: for list in sublist: if list not in newlist: newlist.append(list) print(newlist) print(",,, list in list 중복제거", "," * 100, "\n")
사전의 key, value 출력
d = {"apple": 100, "orange": 200, "banana": 300} for key, value in d.items(): print(key, value) print(";;; 사전 key, value 출력[items() 사용]", ";" * 100, "\n")
데이터프레임의 index, value 출력
inp = [{'c1': 10, 'c2': 100}, {'c1': 11, 'c2': 110}, {'c1': 12, 'c2': 120}] df = pd.DataFrame(inp) print(df, '\n') print("^^^ df 원본 출력", "^" * 100, "\n") for idx, row in df.iterrows(): print("idx=", idx, " c1=", row['c1'], " c2=", row['c2']) # row[0] 형식 가능 print("^^^ DF index, column 출력[iterrows() 사용]", "^" * 100, "\n") for idx in df.index: print("idx=", idx) print("^^^ DF index 출력[df.index 사용]", "^" * 100, "\n") for row in range(0, len(df)): print("row=", row)
DataFrame DB INSERT (ORACLE)
import pandas as pd import cx_Oracle -- Excel 파일읽기 df = pd.read_excel('D:\\MPAA\상장법인목록.xlsx', sheet_name='상장법인목록',usecols=[0, 1], dtype={0:str, 1:str}) -- 컬럼명 지정 df1 = df[['종목코드', '회사명']] -- 데이터프레임을 튜플로 변경 rows = [tuple(x) for x in df1.to_records(index=False)] -- 오라클 연결 con = cx_Oracle.connect('STOCK', '1234', 'ORCL') cursor = con.cursor() cursor.execute('DELETE FROM ITEM_CODE') cursor.executemany("INSERT INTO ITEM_CODE (ITEM_CD, ITEM_NM) VALUES (:1, :2)", rows) con.commit() cursor.execute('SELECT COUNT(*) FROM ITEM_CODE') cnt = cursor.fetchone() print('Insert 건수: ', cnt)
DataFrame DB INSERT (mssql)
import pymssql import pandas as pd # ------------------------------ # -- Create Dataframe # ------------------------------ df = pd.DataFrame({"a_key":[111,222,333], "b_sect":['a1','a2','a3',], "c_mop":["aaaaa","bbbbb","ccccc"], "d_mop":["aaaaa","bbbbb","ccccc"], "e_mop":["aaaaa","bbbbb","ccccc"], "f_mop":["aaaaa","bbbbb","ccccc"]}) print (df) print ("... dataframe", "." * 100, "\n") # ------------------------------ # -- Connection String # ------------------------------ conn = pymssql.connect(host='hostname', user='user', password='password', database='db') cur = conn.cursor() # ------------------------------ # -- Create SQL # ------------------------------ sql = "insert into mop.cn values(%d, %s, %s, %s, %s, %s);" data = [tuple(x) for x in df.values] print("sql:", sql) print("data:", data) print (",,, sql_statement", "," * 100, "\n") # ------------------------------ # -- Execute SQL # ------------------------------ cur.executemany(sql, data) conn.commit()