본문 바로가기

Python_Intermediate/Pandas

Data Preprocessing(데이터 전처리) - 행 추가, 삭제

1. DataFrame Source

grade_dic = {
'국어': [98, 88, 92, 63, None],
'영어': [None, 90, 70, 60, 50],
'수학': [88, 62, None, 31, None],
'과학': [64, 72, None, 70, 88]
}

import pandas
from pandas import DataFrame
from prettytable import PrettyTable

df = DataFrame(grade_dic, index=['코난', '뭉치', '아름', '세모', '장미'])

if isinstance(df, pandas.core.frame.DataFrame):
table = PrettyTable([''] + list(df.columns))
for row in df.itertuples():
table.add_row(row)

print(str(table))

else:
print(df)

+------+------+------+------+------+

|      | 국어 | 영어 | 수학 | 과학 |

+------+------+------+------+------+

| 코난 | 98.0 | nan  | 88.0 | 64.0 |

| 뭉치 | 88.0 | 90.0 | 62.0 | 72.0 |

| 아름 | 92.0 | 70.0 | nan  | nan  |

| 세모 | 63.0 | 60.0 | 31.0 | 70.0 |

| 장미 | nan  | 50.0 | nan  | 88.0 |

+------+------+------+------+------+


Process finished with exit code 0


2. 행 추가 : 기존에 있는 값에 길이랑 다를시 에러 발생함 / 딕셔너리 형태로 지정시 순서 상관 없음

df.loc['모리'] = [100, 20, 30, 50]
df.loc['모리'] = {'국어' : 100, '영어' : 20, '수학' : 30, '과학' : 50}

+------+-------+------+------+------+

|      |  국어 | 영어 | 수학 | 과학 |

+------+-------+------+------+------+

| 코난 |  98.0 | nan  | 88.0 | 64.0 |

| 뭉치 |  88.0 | 90.0 | 62.0 | 72.0 |

| 아름 |  92.0 | 70.0 | nan  | nan  |

| 세모 |  63.0 | 60.0 | 31.0 | 70.0 |

| 장미 |  nan  | 50.0 | nan  | 88.0 |

| 모리 | 100.0 | 20.0 | 30.0 | 50.0 |

+------+-------+------+------+------+


Process finished with exit code 0


길이가 다를시 에러 : ValueError: cannot set a row with mismatched columns

3. 행 복사 : 기존에 있는 행의 값을 새로운 행에 복사
df.loc['모리'] = df.loc['코난']

+------+------+------+------+------+

|      | 국어 | 영어 | 수학 | 과학 |

+------+------+------+------+------+

| 코난 | 98.0 | nan  | 88.0 | 64.0 |

| 뭉치 | 88.0 | 90.0 | 62.0 | 72.0 |

| 아름 | 92.0 | 70.0 | nan  | nan  |

| 세모 | 63.0 | 60.0 | 31.0 | 70.0 |

| 장미 | nan  | 50.0 | nan  | 88.0 |

| 모리 | 98.0 | nan  | 88.0 | 64.0 |

+------+------+------+------+------+


Process finished with exit code 0


4. 단일 행 삭제 : 복사본에 반영

df = df.drop('코난')

+------+------+------+------+------+

|      | 국어 | 영어 | 수학 | 과학 |

+------+------+------+------+------+

| 뭉치 | 88.0 | 90.0 | 62.0 | 72.0 |

| 아름 | 92.0 | 70.0 | nan  | nan  |

| 세모 | 63.0 | 60.0 | 31.0 | 70.0 |

| 장미 | nan  | 50.0 | nan  | 88.0 |

+------+------+------+------+------+


Process finished with exit code 0


5. 여러 행 삭제 : 복사본에 반영

df = df.drop(['코난', '뭉치'])

+------+------+------+------+------+

|      | 국어 | 영어 | 수학 | 과학 |

+------+------+------+------+------+

| 아름 | 92.0 | 70.0 | nan  | nan  |

| 세모 | 63.0 | 60.0 | 31.0 | 70.0 |

| 장미 | nan  | 50.0 | nan  | 88.0 |

+------+------+------+------+------+


Process finished with exit code 0


6. 인덱싱 삭제

df = df.drop(df.index[0])

+------+------+------+------+------+

|      | 국어 | 영어 | 수학 | 과학 |

+------+------+------+------+------+

| 뭉치 | 88.0 | 90.0 | 62.0 | 72.0 |

| 아름 | 92.0 | 70.0 | nan  | nan  |

| 세모 | 63.0 | 60.0 | 31.0 | 70.0 |

| 장미 | nan  | 50.0 | nan  | 88.0 |

+------+------+------+------+------+


Process finished with exit code 0

df = df.drop(df.index[2:4])

+------+------+------+------+------+

|      | 국어 | 영어 | 수학 | 과학 |

+------+------+------+------+------+

| 코난 | 98.0 | nan  | 88.0 | 64.0 |

| 뭉치 | 88.0 | 90.0 | 62.0 | 72.0 |

| 장미 | nan  | 50.0 | nan  | 88.0 |

+------+------+------+------+------+


Process finished with exit code 0


7. 결과 반환없이 삭제(원본 적용)

df = df.drop(['코난', '세모'], inplace=True)

None


Process finished with exit code 0

print(df)

+------+------+------+------+------+

|      | 국어 | 영어 | 수학 | 과학 |

+------+------+------+------+------+

| 뭉치 | 88.0 | 90.0 | 62.0 | 72.0 |

| 아름 | 92.0 | 70.0 | nan  | nan  |

| 장미 | nan  | 50.0 | nan  | 88.0 |

+------+------+------+------+------+


Process finished with exit code 0