반응형

12. 판다스 데이터프레임(DataFrame) 데이터 정렬

1) 기본 코드

import pandas as pd
import numpy as np

data = [['B00232', '새우깡', '2022-11-01', 1600],
         ['B03215', '양파링', '2023-01-31', 1200],
         ['B12098', '계란과자', '2022-06-03', 1400]]
columns = ['바코드', '제품명', '유통기한', '판매가']

df = pd.DataFrame(data=data, columns=columns)

df = df.set_index('바코드')

print(df.sort_index())

print(df.sort_values(by='판매가'))

 

반응형

 

2) 실행 결과

print(df.sort_index())

print(df.sort_index(ascending=False))
         제품명        유통기한   판매가
바코드                           
B00232   새우깡  2022-11-01  1600
B03215   양파링  2023-01-31  1200
B12098  계란과자  2022-06-03  1400

         제품명        유통기한   판매가
바코드                           
B12098  계란과자  2022-06-03  1400
B03215   양파링  2023-01-31  1200
B00232   새우깡  2022-11-01  1600
  • 인덱스값(현재 바코드)을 기준으로 정렬
  • ascending=False로 내림차순 정렬 가능
print(df.sort_values(by='판매가'))

print(df.sort_values(by='판매가', ascending=False))
         제품명        유통기한   판매가
바코드                           
B03215   양파링  2023-01-31  1200
B12098  계란과자  2022-06-03  1400
B00232   새우깡  2022-11-01  1600

         제품명        유통기한   판매가
바코드                           
B00232   새우깡  2022-11-01  1600
B12098  계란과자  2022-06-03  1400
B03215   양파링  2023-01-31  1200
  • 판매가를 기준으로 정렬
  • ascending=False로 내림차순 정렬 가능
반응형
반응형

11. 판다스 데이터프레임(DataFrame) 데이터 타입 변경

1) 기본 코드

import pandas as pd
import numpy as np

data = [['B00232', '새우깡', '2022-11-01', 1600],
         ['B03215', '양파링', '2023-01-31', 1200],
         ['B12098', '계란과자', '2022-06-03', 1400]]
columns = ['바코드', '제품명', '유통기한', '판매가']

df = pd.DataFrame(data=data, columns=columns)

df = df.set_index('바코드')

#판매가 열의 데이터 형식 변경 (int64->int32)
print(df.dtypes)
df2 = df.astype({'판매가':'int32'})

print(df2.dtypes)

#유통기한 열의 데이터 형식 변경(object(string) -> datetime)
df['유통기한'] = pd.to_datetime(df['유통기한'], format="%Y-%m-%d")
print(df.dtypes)

 

반응형

 

2) 실행 결과

print(df.dtypes)
df2 = df.astype({'판매가':'int32'})

print(df2.dtypes)
제품명     object
유통기한    object
판매가      int64
dtype: object

제품명     object
유통기한    object
판매가      int32
dtype: object
  • 데이터 프레임에서 제품명, 유통기한은 문자열(object가 문자열을 뜻함), 판매가는 int64 타입
  • astype 매서드로 판매가 열의 형식을 int64->int32로 변경
df['유통기한'] = pd.to_datetime(df['유통기한'], format="%Y-%m-%d")
print(df.dtypes)
제품명             object
유통기한    datetime64[ns]
판매가              int64
dtype: object
  • 유통기한 열을 pd.to_datetime()을 이용하여 날짜 타입으로 변경
  • format에서 년, 월, 일이 입력되어 있는 형태를 입력
    • 현재 yyyy-mm-dd
    • %Y : 4자리 년도, %y : 2자리 년도
    • '-' : 년, 월, 일을 구분한 구분자 (없으면 안씀)
반응형
반응형

10. 판다스 데이터프레임(DataFrame) 컬럼 이름, 인덱스 이름 바꾸기

1) 기본 코드

import pandas as pd

data = [['B00232', '새우깡', '2022-11-01', 1600],
         ['B03215', '양파링', '2023-01-31', 1200],
         ['B12098', '계란과자', '2022-06-03', 1400]]
columns = ['바코드', '제품명', '유통기한', '판매가']

df = pd.DataFrame(data=data, columns=columns)

df = df.set_index('바코드')

print(df)

 

반응형

 

2) 실행 결과

print(df)
df.columns = ['Name', 'Shelf Life', 'Price']
print(df)
         제품명        유통기한   판매가
바코드                           
B00232   새우깡  2022-11-01  1600
B03215   양파링  2023-01-31  1200
B12098  계란과자  2022-06-03  1400
        Name  Shelf Life  Price
바코드                            
B00232   새우깡  2022-11-01   1600
B03215   양파링  2023-01-31   1200
B12098  계란과자  2022-06-03   1400
  • df.columns로 컬럼 이름 변경이 가능
  • 전체 컬럼의 개수에 맞춰서 리스트 형태로 넣어야 함
    • 특정 몇개만 바꾸려 해도 전체 리스트를 넣어야 함
df.rename(columns={'Name' : '과자이름', 'Shelf Life': '기한'}, inplace=True)
print(df)
        과자이름          기한  Price
바코드                            
B00232   새우깡  2022-11-01   1600
B03215   양파링  2023-01-31   1200
B12098  계란과자  2022-06-03   1400
  • rename()매서드를 이용하여 컬럼 이름 변경
    • columns= 뒤에 딕셔너리 형식으로 입력
    • 바꾸고 싶은 컬럼명만 입력하면 됨
    • 컬럼명의 대소문자도 구분
반응형
반응형

09. 판다스 데이터프레임(DataFrame) 행,열의 추가/삭제 방법 (column, row add, drop)

1) 기본 코드

import pandas as pd

data = [['B00232', '새우깡', '2022-11-01', 1600],
         ['B03215', '양파링', '2023-01-31', 1200],
         ['B12098', '계란과자', '2022-06-03', 1400]]
columns = ['바코드', '제품명', '유통기한', '판매가']

df = pd.DataFrame(data=data, columns=columns)

df = df.set_index('바코드')

print(df)

 

반응형

 

2) 실행 결과

df['판매점'] = ['인천점', '수원점', '인천점']
print(df)
         제품명        유통기한   판매가  판매점
바코드                                
B00232   새우깡  2022-11-01  1600  인천점
B03215   양파링  2023-01-31  1200  수원점
B12098  계란과자  2022-06-03  1400  인천점
  • ['판매점']열을 추가
  • 순서에 맞춰서 ['인천점', '수원점', '인천점']가 입력됨
add_data2 = [['썬칩', '2022-08-25', 1100, '제주점']]
col2 = ['제품명', '유통기한', '판매가','판매점']

s = pd.DataFrame(data=add_data2, index=['B22456'], columns=col2)
df2 = pd.concat([s,df],axis=0)
print(df2)
         제품명        유통기한   판매가  판매점
B22456    썬칩  2022-08-25  1100  제주점
B00232   새우깡  2022-11-01  1600  인천점
B03215   양파링  2023-01-31  1200  수원점
B12098  계란과자  2022-06-03  1400  인천점
  • 하나의 데이터 프레임을 만들어 행을 추가하는 방법
  • concat을 이용하여 두개의 데이터 프레임을 합침
    • concat([데이터프레임1, 데이터프레임2....], axis=0,1..)
      • 데이터 프레임은 1개가 들어가더라도 리스트 형식으로 넣어야 함
      • axis=0은 행으로 데이터를 넣고(위아래로 붙이기) axis=1은 열로 데이터를 넣음(옆으로 붙이기)
    • append가 아닌 concat사용 이유
      • 단순하게 현재 데이터 프레임(df)에 append(s)를 해도 이상없이 추가가 됨
      • 하지만 아래의 경고처럼 추후에 기능이 삭제될 예정
        • FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
add_data3 = [['썬칩', '2022-08-25', 1100, '제주점']]
col3 = ['제품명', '유통기한', '판매가','판매점']

s = pd.DataFrame(data=add_data3, index=['B22456'], columns=col3)
df3 = df.append(s)
print(df3)
         제품명        유통기한   판매가  판매점
B00232   새우깡  2022-11-01  1600  인천점
B03215   양파링  2023-01-31  1200  수원점
B12098  계란과자  2022-06-03  1400  인천점
B22456    썬칩  2022-08-25  1100  제주점


C:\Users\Lee\AppData\Local\Temp\ipykernel_2832\2065307237.py:5: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
  df3 = df.append(s)
print(df.drop(['유통기한'], axis=1))
         제품명   판매가  판매점
바코드                    
B00232   새우깡  1600  인천점
B03215   양파링  1200  수원점
B12098  계란과자  1400  인천점
  • Series와 마찬가지로 drop을 이용하여 특정 데이터 제외
    • Series와 마찬가지로 원본 데이터에서 데이터가 삭제되는 것은 아님
  • axis=1로 컬럼 전체를 삭제
print(df.drop(['B00232', 'B12098'], axis=0))
        제품명        유통기한   판매가  판매점
바코드                               
B03215  양파링  2023-01-31  1200  수원점
  • Series와 마찬가지로 drop을 이용하여 특정 데이터 제외
    • Series와 마찬가지로 원본 데이터에서 데이터가 삭제되는 것은 아님
  • axis=0으로 로우 전체를 삭제
반응형
반응형

08. 판다스 데이터프레임(Pandas DataFrame) 범위 데이터 사용하기

1) 기본 코드

import pandas as pd

data = [['B00232', '새우깡', '2022-11-01', 1600],
         ['B03215', '양파링', '2023-01-31', 1200],
         ['B12098', '계란과자', '2022-06-03', 1400]]
columns = ['바코드', '제품명', '유통기한', '판매가']

df = pd.DataFrame(data=data, columns=columns)

df = df.set_index('바코드')

print(df)

 

반응형

 

2) 실행 결과

fdf = df['판매가'] > 1500
print(fdf)
print(df[fdf])
바코드
B00232     True
B03215    False
B12098    False
Name: 판매가, dtype: bool

        제품명        유통기한   판매가
바코드                          
B00232  새우깡  2022-11-01  1600
  • df에서 판매가가 1500인 행 찾기
  • print(df[fdf])로 해당 데이터만 출력
fdf2 = df.iloc[0:2]['판매가'] > 1500
print(fdf2)
print(df[fdf2])
바코드
B00232     True
B03215    False
Name: 판매가, dtype: bool


C:\Users\Lee\AppData\Local\Temp\ipykernel_11352\1377462347.py:3: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
  print(df[fdf2])



---------------------------------------------------------------------------

IndexingError                             Traceback (most recent call last)

Input In [11], in <module>
      1 fdf2 = df.iloc[0:2]['판매가'] > 1500
      2 print(fdf2)
----> 3 print(df[fdf2])


File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\frame.py:3497, in DataFrame.__getitem__(self, key)
   3495 # Do we have a (boolean) 1d indexer?
   3496 if com.is_bool_indexer(key):
-> 3497     return self._getitem_bool_array(key)
   3499 # We are left with two options: a single key, and a collection of keys,
   3500 # We interpret tuples as collections only for non-MultiIndex
   3501 is_single_key = isinstance(key, tuple) or not is_list_like(key)


File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\frame.py:3550, in DataFrame._getitem_bool_array(self, key)
   3544     raise ValueError(
   3545         f"Item wrong length {len(key)} instead of {len(self.index)}."
   3546     )
   3548 # check_bool_indexer will throw exception if Series key cannot
   3549 # be reindexed to match DataFrame rows
-> 3550 key = check_bool_indexer(self.index, key)
   3551 indexer = key.nonzero()[0]
   3552 return self._take_with_is_copy(indexer, axis=0)


File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\indexing.py:2375, in check_bool_indexer(index, key)
   2373     mask = isna(result._values)
   2374     if mask.any():
-> 2375         raise IndexingError(
   2376             "Unalignable boolean Series provided as "
   2377             "indexer (index of the boolean Series and of "
   2378             "the indexed object do not match)."
   2379         )
   2380     return result.astype(bool)._values
   2381 if is_object_dtype(key):
   2382     # key might be object-dtype bool, check_array_indexer needs bool array


IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match).
  • df는 3행이고 fdf는 2행이므로 서로 행수가 맞지 않아 에러 발생
  • df.iloc[0:1]을 이용하여 같은 2행으로 행수를 맞춰줘야 아래처럼 이상없이 실행 가능
print(df.iloc[0:1][fdf])
        제품명        유통기한   판매가
바코드                          
B00232  새우깡  2022-11-01  1600
반응형
반응형

07. 판다스 데이터프레임(DataFrame) row, column 데이터 출력 방법

1) 기본 코드

import pandas as pd

data = [['B00232', '새우깡', '2022-11-01', 1600],
         ['B03215', '양파링', '2023-01-31', 1200],
         ['B12098', '계란과자', '2022-06-03', 1400]]
columns = ['바코드', '제품명', '유통기한', '판매가']

df = pd.DataFrame(data=data, columns=columns)

# df = df.set_index('바코드')

print(df)
print(df['유통기한'])
      바코드   제품명        유통기한   판매가
0  B00232   새우깡  2022-11-01  1600
1  B03215   양파링  2023-01-31  1200
2  B12098  계란과자  2022-06-03  1400
0    2022-11-01
1    2023-01-31
2    2022-06-03
Name: 유통기한, dtype: object

 

반응형

 

2) 실행 결과

df = df.set_index('바코드')
print(df)
         제품명        유통기한   판매가
바코드                           
B00232   새우깡  2022-11-01  1600
B03215   양파링  2023-01-31  1200
B12098  계란과자  2022-06-03  1400
  • 인덱스가 될 컬럼명을 설정
print(df['유통기한'])
print(df[['제품명','판매가']])
바코드
B00232    2022-11-01
B03215    2023-01-31
B12098    2022-06-03
Name: 유통기한, dtype: object

         제품명   판매가
바코드               
B00232   새우깡  1600
B03215   양파링  1200
B12098  계란과자  1400
  • 인덱스와 df의 유통기한 컬럼만 출력
  • 인덱스와 df의 유통기한, 판매가만 출력
print(df.loc[['B00232','B12098']])
print(df.iloc[1])
         제품명        유통기한   판매가
바코드                           
B00232   새우깡  2022-11-01  1600
B12098  계란과자  2022-06-03  1400

제품명            양파링
유통기한    2023-01-31
판매가           1200
Name: B03215, dtype: object
  • df.loc[['B00232','B12098']]으로 새우깡의 row(제품명, 유통기한, 판매가)를 출력
  • df.iloc[1]으로 양파일의 row(제품명, 유통기한, 판매가)를 출력
  • Pandas Series에서의 iloc, loc과 같은 방식
반응형
반응형

06. 판다스 데이터프레임(Pandas DataFrame) 만드는 3가지 방법

0) 사용 이유

  1. 2차원 데이터를 다루기 위하여 사용
    1. 시리즈는 1차원 데이터만 사용 가능
  2. R의 DataFrame을 참고해서 만듬 -> 데이터 편집, 관리에 용의

1) 기본 코드

import pandas as pd

#딕셔너리 사용
data1 = {'제품명': ['새우깡', '양파링', '계란과자'],
        '유통기한': ['2022-11-01', '2023-01-31', '2022-06-03'],
        '판매가' : [1600, 1200, 1400]}

df1 = pd.DataFrame(data=data1)
print(df1)

#리스트 사용
data2 = [['새우깡', '2022-11-01', 1600],
         ['양파링', '2023-01-31', 1200],
         ['계란과자', '2022-06-03', 1400]]
columns2 = ['제품명', '유통기한', '판매가']

df2 = pd.DataFrame(data=data2, columns=columns2)
print(df2)

#리스트 + 딕셔너리 사용
data3 = [{'제품명':'새우깡', '유통기한':'2022-11-01', '판매가':1600},
         {'제품명':'양파링', '유통기한':'2023-01-31', '판매가':1200},
         {'제품명':'계란과자', '유통기한':'2022-06-03', '판매가':1400}]

df3 = pd.DataFrame(data=data3)
print(df3)

 

반응형

 

2) 실행 결과

#딕셔너리 사용
data1 = {'제품명': ['새우깡', '양파링', '계란과자'],
        '유통기한': ['2022-11-01', '2023-01-31', '2022-06-03'],
        '판매가' : [1600, 1200, 1400]}

df1 = pd.DataFrame(data=data1)
print(df1)
    제품명        유통기한   판매가
0   새우깡  2022-11-01  1600
1   양파링  2023-01-31  1200
2  계란과자  2022-06-03  1400
  • 각 행을 기준으로 딕셔너리로 묶어서 데이터 프레임을 만드는 방법
#리스트 사용
data2 = [['새우깡', '2022-11-01', 1600],
         ['양파링', '2023-01-31', 1200],
         ['계란과자', '2022-06-03', 1400]]
columns2 = ['제품명', '유통기한', '판매가']

df2 = pd.DataFrame(data=data2, columns=columns2)
print(df2)
    제품명        유통기한   판매가
0   새우깡  2022-11-01  1600
1   양파링  2023-01-31  1200
2  계란과자  2022-06-03  1400
  • 각 행별 데이터입력과 컬럼명을 따로 입력하는 방법
#리스트 + 딕셔너리 사용
data3 = [{'제품명':'새우깡', '유통기한':'2022-11-01', '판매가':1600},
         {'제품명':'양파링', '유통기한':'2023-01-31', '판매가':1200},
         {'제품명':'계란과자', '유통기한':'2022-06-03', '판매가':1400}]

df3 = pd.DataFrame(data=data3)
print(df3)
    제품명        유통기한   판매가
0   새우깡  2022-11-01  1600
1   양파링  2023-01-31  1200
2  계란과자  2022-06-03  1400
  • 리스트 안에 각 데이터를 딕셔너리로 묶어서 만드는 방법

3) 각 방법별 차이

  1. 만드는 방법에서의 차이는 있으나 결과적으로 DataFrame으로 만들어 사용하면 같은 형식
  2. 결론적으로 차이는 없음
반응형
반응형

05. 판다스 시리즈(Pandas Series) 필터, 정렬 (filltering, sort)

1) 기본 코드

import pandas as pd

data1 = [1, 2, 3, 4, 5]
index1 = ['row3', 'row2', 'row1', 'row5', 'row4']

s1 = pd.Series(data=data1, index=index1)

fs = s1 > 3

print(fs)
print(s1[fs])
print(s1[fs].sort_index())
print(s1[fs].sort_values())

 

반응형

 

2) 실행 결과

fs = s1 > 3
print(fs)
row3    False
row2    False
row1    False
row5     True
row4     True
dtype: bool
  • fs = s1 > 3
    • s1에서 3이 넘는지 체크, True/False값 반환
print(s1[fs])
row5    4
row4    5
dtype: int64
  • s1에서 fs가 True인 행만 출력
print(s1[fs].sort_index())
row4    5
row5    4
dtype: int64
  • s1에서 fs가 True인 행을 인덱스값 기준으로 오름차순 출력
  • ascending=False로 내림차순으로 변경 가능
print(s1[fs].sort_values())
row5    4
row4    5
dtype: int64
  • s1에서 fs가 true인 행을 값 기준으로 오름차순 출력
  • ascending=False로 내림차순으로 변경 가능
반응형

+ Recent posts