[python] pandas 행, 열 삭제하는 법
pandas 행, 열 삭제하는 법
import pandas as pd
rows = ["c1", "c2", "c3", "c4", "c5"]
cols = ["A", "B", "C", "D", "E"]
data = {
cols[0]: [100, 101, 102, 103, 104],
cols[2]: [300, 301, 302, 303, 304]
}
df = pd.DataFrame(data, index=rows, columns=cols)
df = df.fillna(0)
print(df)
# 출력
# A B C D E
# c1 100 0 300 0 0
# c2 101 0 301 0 0
# c3 102 0 302 0 0
# c4 103 0 303 0 0
# c5 104 0 304 0 0
rows = ["c1", "c2", "c3", "c4", "c5"]
cols = ["A", "B", "C", "D", "E"]
data = {
cols[0]: [100, 101, 102, 103, 104],
cols[2]: [300, 301, 302, 303, 304]
}
df = pd.DataFrame(data, index=rows, columns=cols)
df = df.fillna(0)
print(df)
# 출력
# A B C D E
# c1 100 0 300 0 0
# c2 101 0 301 0 0
# c3 102 0 302 0 0
# c4 103 0 303 0 0
# c5 104 0 304 0 0
row, column에 사용할 명칭을 설정하고 data 값을 넣어 DataFrame을 생성했습니다.
1. column(열) 삭제
1-1. del을 이용한 column 삭제 [1]
del은 index 값을 기반으로 값을 삭제하며 특정 index 또는 slice를 통해 값을 삭제할 수 있습니다.
del df["A"]
print(df)
# 출력
# B C D E
# c1 0 300 0 0
# c2 0 301 0 0
# c3 0 302 0 0
# c4 0 303 0 0
# c5 0 304 0 0
pandas 객체를 slice하여 여러행을 삭제하기 위해서는 아래와 같은 방식으로 사용해야합니다.print(df)
# 출력
# B C D E
# c1 0 300 0 0
# c2 0 301 0 0
# c3 0 302 0 0
# c4 0 303 0 0
# c5 0 304 0 0
for col in df.columns:
if col == "A" or col == "C":
del df[col]
print(df)
# 출력
# B D E
# c1 0 0 0
# c2 0 0 0
# c3 0 0 0
# c4 0 0 0
# c5 0 0 0
if col == "A" or col == "C":
del df[col]
print(df)
# 출력
# B D E
# c1 0 0 0
# c2 0 0 0
# c3 0 0 0
# c4 0 0 0
# c5 0 0 0
1-2. drop을 이용한 column 삭제 [2]
drop은 row or column label을 입력하면 그 값들을 지워줍니다.
row, column을 지울 때 2가지 방법이 존재합니다.
1-2-1. axis 명시 [2, 3]
axis = 0은 각 column에 값을 가져옵니다.
axis = 1은 각 row값을 가져옵니다.
즉. axis=0은 row을, axis=1은 column을 의미합니다.
1-2-2. columns 명시 [2]
drop("A", axis=1) == drop(columns="A")와 동일합니다.
axis=1은 column이니 drop("A", axis=1)은 "A" column 값을 제거하겠다는 의미입니다.
axis, column 둘 중 더 편한 방법으로 사용하시면 됩니다.
df = df.drop("A", axis=1)
# df = df.drop(columns="A")
print(df)
# 출력
# B C D E
# c1 0 300 0 0
# c2 0 301 0 0
# c3 0 302 0 0
# c4 0 303 0 0
# c5 0 304 0 0
# df = df.drop(columns="A")
print(df)
# 출력
# B C D E
# c1 0 300 0 0
# c2 0 301 0 0
# c3 0 302 0 0
# c4 0 303 0 0
# c5 0 304 0 0
여러 column을 삭제하기 위해서는 아래와 같은 방식으로 사용하면 됩니다.
df = df.drop(["A", "C"], axis=1)
# df = df.drop(columns=["A", "C"])
print(df)
# 출력
# B D E
# c1 0 0 0
# c2 0 0 0
# c3 0 0 0
# c4 0 0 0
# c5 0 0 0
# df = df.drop(columns=["A", "C"])
print(df)
# 출력
# B D E
# c1 0 0 0
# c2 0 0 0
# c3 0 0 0
# c4 0 0 0
# c5 0 0 0
column 삭제 방법으로 del과 drop을 알아봤는데
del은 "remove an item from a list"라며 list를 기준으로 remove가 일어납니다.
drop은 pandas.DataFrame.drop method로서 pandas에 특화되어 있기 때문에 drop을 사용하는걸 추천드립니다.
2. row(행) 삭제 [3]
drop("c1", axis=0) == drop(index="c1")과 동일합니다.
df = df.drop("c1") # df = df.drop("c1", axis=0)
# df = df.drop(index="c1")
print(df)
# 출력
# A B C D E
# c2 101 0 301 0 0
# c3 102 0 302 0 0
# c4 103 0 303 0 0
# c5 104 0 304 0 0
# df = df.drop(index="c1")
print(df)
# 출력
# A B C D E
# c2 101 0 301 0 0
# c3 102 0 302 0 0
# c4 103 0 303 0 0
# c5 104 0 304 0 0
drop에서 axis는 default가 0이기 때문에 굳이 명시하지 않아도 상관없습니다.
df = df.drop(["c1", "c3"]) # df = df.drop(["c1", "c3"], axis=0)
# df = df.drop(index=["c1", "c3"])
print(df)
# 출력
# A B C D E
# c2 101 0 301 0 0
# c4 103 0 303 0 0
# c5 104 0 304 0 0
# df = df.drop(index=["c1", "c3"])
print(df)
# 출력
# A B C D E
# c2 101 0 301 0 0
# c4 103 0 303 0 0
# c5 104 0 304 0 0
참고문헌
[1] https://docs.python.org/3/tutorial/datastructures.html
[2] https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html
[3] https://stackoverflow.com/questions/22149584/what-does-axis-in-pandas-mean
[2] https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html
[3] https://stackoverflow.com/questions/22149584/what-does-axis-in-pandas-mean
axis = 0은 각 column에 값을 가져옵니다.
답글삭제axis = 1은 각 row값을 가져옵니다.
여기에서 axis = 0은 가로 즉 row를 의미하고,
axis = 1은 세로 즉 colnmn을 의미하는 것 아닌지요?
row와 column이 다르게 표시된듯하여 확인코자 태클걸어 봅니다.
표상에 그림이 헷갈리게 되어 댓글달았으나, 설명은 또 잘해 놓으셨네요. 미안합니다. 글을 삭제하려고 하는데 삭제가 안되서 수정 댓글 답니다.
삭제네, axis=0은 row, axis=1은 column을 의미합니다.
삭제제 의도는 axis=0은 "각 column에 해당하는 값을 가져오기 때문에 row이다"를 표현하고자 그림에서 각 column에 axis=0을 표기했습니다. (그림 상에서 빨간 테두리는 row를 뜻하는 의도로)
충분히 이해에 어려움이 있어보이네요. 좀 더 직관적으로 표현할 수 있도록 노력하겠습니다.
관심가져주셔서 감사합니다 ~~!