반응형
만약 엑셀에서 중복된 데이터를 가진 여러 행이 있을때 그것을 key기준으로 하나의 행으로 줄이고 싶다면 어떻게 해야 할까?
ex) 회사에서 pdf공시파일과 엑셀에 있는 데이터를 비교해보고 맞는지 확인해보라고 합니다
데이터는 아래와 같이 되어있는데 같은 key를 가지고 있고 같은 값을 갖고있는 데이터인걸 확인했습니다
이 데이터에 행이 너무나 많아서 key가 1인것을 비교할때 눈으로 4번비교를 해야합니다
이 여러행을 1줄로 줄이려면 어떻게해야할까요?
전략1
중복된 데이터는 하나로 표시하고, 중복이 아닌 데이터는 리스트 형태로 저장한다
import pandas as pd
def all_same(items):
target = items.iloc[0]
for i in items:
if target != i:
return False
return True
def reduce_dataframe(target, key):
data = []
unique_keys = target[key].unique()
columns = target.columns
columns = columns.delete(columns.get_loc(key))
for fcd in unique_keys:
part = target[(target[key] == fcd)]
part = part.fillna('')
if part.empty: continue
item = {key: fcd}
for column in columns:
if all_same(part[column]):
item[column] = part[column].iloc[0]
else:
item[column] = part[column].to_list()
data.append(item)
return pd.DataFrame(data)
input_data = [
{'key': 1, 'a': 123, 'b': 456, 'c': 789},
{'key': 1, 'a': 123, 'b': 666, 'c': 789},
{'key': 1, 'a': 123, 'b': 456, 'c': 789},
{'key': 2, 'a': 555, 'b': 777, 'c': 789},
{'key': 2, 'a': 555, 'b': 777, 'c': 555},
]
df = pd.DataFrame(input_data)
print(df)
new_df = reduce_dataframe(df, "key")
print(new_df)
전략2
중복된 데이터는 하나로 표시하고, 중복이 아닌 데이터는 여러개의 컬럼을 만들어 늘려서 저장한다
import pandas as pd
def all_same(items):
target = items.iloc[0]
for i in items:
if target != i:
return False
return True
def reduce_dataframe(target, key):
data = []
unique_keys = target[key].unique()
columns = target.columns
columns = columns.delete(columns.get_loc(key))
for fcd in unique_keys:
part = target[(target[key] == fcd)]
part = part.fillna('')
if part.empty: continue
item = {key: fcd}
for column in columns:
if all_same(part[column]):
item[column] = part[column].iloc[0]
else:
for index, i in enumerate(part[column].tolist()):
item[column + '_' + str(index)] = i
data.append(item)
return pd.DataFrame(data)
input_data = [
{'key': 1, 'a': 123, 'b': 456, 'c': 789},
{'key': 1, 'a': 123, 'b': 666, 'c': 789},
{'key': 1, 'a': 123, 'b': 456, 'c': 789},
{'key': 2, 'a': 555, 'b': 777, 'c': 789},
{'key': 2, 'a': 555, 'b': 777, 'c': 555},
]
df = pd.DataFrame(input_data)
print(df)
new_df = reduce_dataframe(df, "key")
print(new_df)
전략1 코드에서 몇줄만 고쳐주면됌
Nan값이 많아서 데이터가 좀 더러워보이는듯하고 많이 늘여져서 가독성이 떨어짐
개인적으로 전략1이 눈으로 비교하기 더 좋아보임
좋은 전략이 있으면 공유부탁~
반응형
'Python' 카테고리의 다른 글
python 주식 퀀트&백테스팅 관련 라이브러리 정리 (0) | 2022.07.30 |
---|---|
python 무료 vpn을 통해 ip 바꾸기 (1) | 2022.07.24 |
Python 이미지파일(jpg) pdf로 바꾸기 (0) | 2022.06.27 |
파이썬 유튜브 영상 정보 다운로드하기 pytube (0) | 2022.06.20 |
Python smtpllib를 이용한 이메일 보내기 (0) | 2022.03.10 |