DataFrame 데이터 조작
페이지정보
내용
DataFrame 데이터 조작
출처 : https://pandas.pydata.org/pandas-docs/stable/reference/frame.html
데이터 변경
데이터를 선택하는 다양한 방법이 있었다. 데이터변경은 선택한 데이터에 새로운 값을 넣어주면 된다.
columns을 선택한 후, 데이터의 갯수에 맞는 Series나 list를 입력하면 columns의 값이 바뀌고, 만약 없는 column 이름에 새로운 데이터를 넣으면 새로운 column이 추가된다.
마찬가지로 columns 전체가 아니라 loc, iloc, at, iat 등으로 선택한 각 위치의 값들도 모두 변경해 줄 수 있다.
1. column 값 전체 변경하기
기존 값 변경 - 존재하는 column 이름
data['국어'] = ['A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A']
새로운 값 추가 - 새로운 column 이름
data['group'] = ['A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A']
data['국어'] = ['A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A'] print(data)
data['group'] = ['A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A'] print(data) |
결과
번호 국어 영어 수학 과학
|
2. 특정 위치 값 변경하기
특정 위치 값을 찾아서 새로운 값을 입력해주면 된다.
1) 한개 값 변경
data.at[0, '국어'] = 100
2) 여러 개 rows 값 변경
data.loc[1:3, '국어'] = [10, 25, 34]
data.at[0, '국어'] = 100 data.loc[1:3, '국어'] = [10, 25, 34] print(data) |
결과
번호 국어 영어 수학 과학 group |
3) 여러 개의 rows, columns 값 변경
data.loc[0:3, ['수학','과학']] = [[10,10], [20,20], [30,30], [40,40]]
print(data.loc[0:3, ['수학','과학']]) |
결과
수학 과학
|
다양한 위치의 값을 찾아서 변경하는 연습을 해본다.
3. drop() - rows 또는 columns 삭제
rows또는 coumns를 삭제하는 메서드는 drop()이다.
axis argument는 row또는 column을 선택한다. drop(list, axis) 메서드를 사용했을 시, 결과는 새로운 DataFrame으로 저장한다.
axis = 0 : rows (default)
axis = 1 : columns
data = data.drop(0)
data = data.drop([5, 7])
data = data.drop('국어', axis = 1)
data = data.drop(['영어','수학'], axis = 1)
data = data.drop(0)
data = data.drop([5, 7]) print(data)
data = data.drop('국어', axis = 1)
data = data.drop(['영어','수학'], axis = 1) print(data) |
결과
번호 국어 영어 수학 과학 group
번호 과학 group |
drop()으로 삭제한 rows의 index를 보면 삭제된 index가 그대로 유지된다. 따라서 index를 재 정렬하기 위해서는 reset_index(drop=True) 메서드를 사용한다.
drop을 False(default)로 설정하면 기존 index가 index라는 column 이름으로 새로운 column이 생기게 된다.
data = data.reset_index(drop=True) print(data) |
결과
번호 과학 group |
4. pop()으로 column 결과를 얻고 삭제하기
pop(column) 메서드를 이용하면, 입력한 column의 내용을 Series로 반환하고 그 column은 삭제된다. drop() 처럼 원본이 남지 않고, DataFrame에 바로 반영되기 때문에 pop()한 결과물은 따로 저장해두는 것이 좋다.
column_eng = data.pop('영어') print(column_eng) print(data) |
결과
0 56
|
pop()으로 return된 결과는 Series이다. Series는 values와 name을 갖는다.
저장된 column_eng를 다시 data에 입력해본다.
data[column_eng.name] = column_eng.values print(data) |
결과
번호 국어 수학 과학 영어 |
5. insert()로 columns 입력하기
insert() 메서드를 통해 column을 원하는 위치에 삽입할 수 있다. 삽입된 결과는 DataFrame에 바로 적용된다.
DataFrame.insert(self, loc, column, value, allow_duplicates=False)
loc은 column이 들어갈 위치이며, 0에서 column의 갯수의 범위안에서 설정한다. over하면 error 발생
만약, allow_duplicates가 False이고 column 이름이 중복이면 ValueError가 발생한다.
data.insert(0, column_eng.name, column_eng.values) |
결과
영어 번호 국어 수학 과학 |
6. Missing Data(결측치) 처리
프로그래밍에서는 데이터가 들어있지 않는 결과를 None, Null 등으로 표현한다. 이러한 값은 연산이나 통계를 처리할 수 없어서 Missing Data(결측값)라고 한다.
pandas에서 Missing Data는 NaN으로 표현하는데 이는 numpy.nan의 표현 방법이다. 따라서 DataFrame의 value가 NaN일 경우를 판단하는 코드는 if numpy.isnan(A): 또는 if pandas.isna(A):식으로 만들면 된다.
* 작성한 DataFrame에서 결측치가 한개라도 있는 행들을 삭제하고 싶을 때는 DataFrame.dropna() 메서드를 사용한다.
* 결측치가 있는 행을 버리지 않고, 결측치를 다른 값으로 변경하고 싶을 때는 DataFrame.fillna(value) 메서드를 사용한다.
* 해당 값이 NaN인지 확인할 때는 pd.isna() 메서드를 사용한다.
datasample.xlsx 파일의 몇 군데 값을 삭제하고 테스트 해본다.
1) 결측된 데이터 보기
print(data) print(pd.isna(data)) |
결과
번호 국어 영어 수학 과학
|
2) 결측된 데이터 삭제 - NaN 값이 있는 row 전체 삭제
data = data.dropna() print(data) |
결과
번호 국어 영어 수학 과학 |
3) 결측된 데이터 변경하기
data = data.fillna(value=100) |
결과
번호 국어 영어 수학 과학 |
7. 지정한 값을 다른 데이터를 변경
DataFrame.replace() 메서드를 통해 설정한 값을 다른 값으로 변경할 수 있다.
DataFrame.replace(self, to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad')
만약 결측값을 변경하고 싶다면 아래와 같이 한다.
data = data.replace(np.nan, 100) |
결과
번호 국어 영어 수학 과학 |
replace() 메서드는 결측값만 변경하는 것이 아니라 변경하고 싶은 값은 어떤 것이건 대입할 수 있으므로 다양하게 사용할 수 있다.
8. 함수를 사용한 값 변경
DataFrame.apply() 메서드를 통해 함수를 적용할 수 있다.
DataFrame.apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwds)
만약 수학 점수에 따라 등급을 A, B, C로 나누고 싶다면 아래와 같이 작성할 수 있다.
def func(row):
data['수학'] = data['수학'].apply(func) print(data) |
결과
번호 국어 영어 수학 과학 |
하지만 위의 방법으로 하면 수학값이 모두 A, B, C로 바뀌어 원래 점수를 알 수 없게 된다.
따라서 변경된 값을 다른 column으로 저장을 한다면, 원본 값을 유지할 수 있다.
def func(row):
data['Grade'] = data['수학'].apply(func) print(data) |
결과
번호 국어 영어 수학 과학 Grade |
특정 칼럼을 선택해서 function을 적용하는 것이 아니라 data전체를 apply()할 때는 func내에서 row[column] 값을 지정해주면 된다. 그리고 apply() 메소드의 axis 속성을 1로 설정한다.
아래 코드의 결과는 위와 같다.
def func(row):
data['Grade2'] = data.apply(func, axis = 1) print(data) |
결과
번호 국어 영어 수학 과학 Grade2 |
data 전체를 apply() 메서드로 적용시킬때, row는 행 전체를 의미한다. 따라서 여러개의 column을 이용하여 조건을 다양하게 만들 수 있다.
def func(row):
data['Grade2'] = data.apply(func, axis = 1) print(data) |
apply() 메서드의 function을 lamda로 처리할 수도 있다.
data['Grade3'] = data['수학'].apply(lambda x: 'A' if x > 90 else 'B' if x > 80 else 'C') print(data) |
결과
번호 국어 영어 수학 과학 Grade3 |
8. append() - row 추가
append() 메서드는 row를 추가하는 기능을 한다.
DataFrame.append(self, other, ignore_index=False, verify_integrity=False, sort=False)
other : DataFrame 또는 Series/dictionary, list
ignore_index = False : other가 가지고 있던 index가 유지된다. (default)
ignore_index = True : other가 가지고 있던 index가 무시되고, DataFrame의 index가 추가된다.
append() 메서드를 사용할 때는 동일한 column 이름을 설정해줘야 한다. 만약 column 이름이 다르면 새로운 column이 생기며 column과 row가 동시에 늘어난다. 값이 제공되지 않은 위치 값은 NaN으로 표시된다.
append_data = pd.Series([100, 200], ['국어','수학']) result = data.append(append_data, ignore_index=False) print(result) |
결과
번호 국어 영어 수학 과학 |