본문 바로가기
info : 유용한 정보, 체험기

파이썬으로 데이터 입력 하기 및 삭제하기 pandas 를 이용해 csv 파일 편하게 수정하기.

by 퇴근길에 삼남매가 알려드림 2022. 11. 15.

파이썬으로 데이터 파일에 특정 데이터 입력 하기 및 삭제하기 함수를 만드는 법에 대해서 알아보겠다.
일정 형식으로 나뉘어진 데이터는 파이썬의 판다스 라이브러리 (pandas) 를 read_csv 나 read_table 을 이용하면 편리하다.

pandas를 이용하면 데이트가 예쁘게 표로 나타나고, 이 데이터 값을 추가하거나, 위치를 찾거나 수정할 때 편하게 할 수 있다.

초반에는 왜 다들 pandas 판다스 할까 했는데, 데이터를 다루는 많은 분야나 데이터 사이언스 분야에서 유용하게 이용할 수 있다. 

대학원 논문을 쓰거나 통계 낼 때도 산업계에서 많이 쓰는 라이브러리나 툴을 일부러라도 익혀두면, 처음에는 배우느라 고생해도 이력서에 한 줄 넣을 수 있다.

 

일단, 데이터가 일정 형식으로 나뉘어졌으므로 pandas 의 read_csv 함수를 이용한다.

보통 csv 파일은 쉼표 (콤마 , )로 데이터가 나뉘어져 있다. 그럴 우 delimiter 를 따로 지정해주지 않아도 된다.

하지만 다른 형식으로 데이터가 나뉘어져 있다면 delimiter 라는 키워드를 이용해서 그 형식을 지정해준다.

예를 들어서 데이터가 

 

학생번호:이름:이메일:학기:듣고있는 과목수[과목])

 

1234:John Doe:JD@google.com:1:3[SSS111, OPP222, ENG111]
1111:Jane Doe:JJ@google.com:2:4[OPP222, ENG444, QQQ333, DDD333]
 
이런식으로 되어있다면
delimiter=":" 
를 이용한다.

 

만약 데이터는 : 로 구분되었는데, 맨 윗줄에 데이터의 column 열 이름 형식은 : 로 구분되어 있지 않다면, names 키워드로 이름을 지정해준다.

 

names= ['학생번호','이름','이메일','학기','듣고 있는 과목수[과목]']

를 넣어준다.

 

이때, header =0 을 빼 먹으면, 첫번째 줄도 하나의 행으로 입력되므로 <헤더, 즉 표의 각 행 이름은 인덱스 0 번째 줄이다>라는 의미로 header =0  도 넣어준다.

이를 합치면, 데이터 이름이 sample.dat 이라고 할 때 아래와 같이 데이터를 불러올 수 있다.

 

df = pd.read_csv('sample.dat',delimiter=":",
header=0,names= ['학생번호','이름','이메일','학기','듣고 있는 과목수[과목]'])

그럼 아래처럼 예쁘게 나옴. sample.dat 은 파일이름인데 studentsDatabase.dat 로 바꿔주면 된다.

예시
예시

 

 

 

이렇게 되면,

이제 각 행이나 열을 리스트로 불러와서 데이터가 이미 있는지 아닌지 확인 할 수 있다.
그게 아니면 for loop 을 돌려야 했을 수 있다.

df = pd.read_csv('sample.dat',delimiter=":",
header=0,names= ['학생번호','이름','이메일','학기','듣고 있는 과목수[과목]'],
index_col=False)
# 이렇게 된다.
# line.split( )이게 이미 위에서 허용 된거..
display(df)

def adds(df, stID):
stID=int(stID)
if stID in df["학생번호"].to_list():
print("존재하는 학생번호")
else:
name = input("이름: ")
semester = input("현재 학기: ")
email = input("이메일l: ")
course = int(input("현재 듣고있는 과목수[숫자]: "))
course_nums = input("현재 듣고있는 과목 : ")
course_and_nums = f'{course}[{course_nums}]'
df.loc[len(df.index)] = [stID,name,semester,email,course_and_nums]

return df
df=adds(df,input("학생번호: "))

이제, 결과 값을 저장한다.
다만, 이때 똑같이 : 로 각 값을 나누고 싶다면 sep을 이용해준다. 학생 번호 앞에 인덱스는 index= 을 이용해서 저장하지 않는다.
df.to_csv("udpated_data2.dat",sep=":",index=False)


코드는 위 지스트 눌르면 가서 복사 할 수 있다


질문자가 원하는 방식으로 할 경우에

student_id_list = []
for idx in range(len(students)):
student_id_list.append(students[0])

if stID in student_id_list:
print("존재하는 학생번호")

라고 코드를 쓰면 존재하는 학생 번호가 있나 없나 확인이 된다. 다만 이 경우, 존재하지 않는 학생 (else) 문에서 student_id_list 를 업데이트 해주어야 한다.

이제 삭제!
삭제도 아래와 같이 해주면 된다.

def remove(df, stID):
stID=int(stID)
get_index =df[df["학생번호"]==stID].index
if len(get_index)==1:
df=df.drop(get_index[0])
elif len(get_index)>1:
print(f'학생 번호 {stID}가 1개 이상')
df=df.drop(get_index)
else:
print('학생 번호 존재하지 않음')
df =df.reset_index(drop=True)
return df
df=remove(df,input("학생번호: "))


여기서, 판다에서 해당 열에 해당 값이 있는지 여부를 .index 를 통해서 찾을 수 있다.
만약 있으면 인덱스 길이가 0보다 크다.
우리는 중복된 학생 번호가 없단 가정하게 일을 한다.
만약 중복된 학생 번호가 있다면 그 정보를 출력하고 다 지워준다.

 

 

----- Update ---

만약.. 그냥 한줄씩 읽고 한줄씩 지우고 싶다면 아래와 같이 하면 된다.

단 이건, 한 번 할 때마다 for loop 돌리게 된다. 

 

728x90
반응형

댓글


TOP