CSV를 읽고 중복 요소를 포함하는 목록을 제거하고 싶습니다.
경위
데이터의 해석을 위해서, 폴더에 들어 있는 CSV를 모두 읽어들여 그 안의 수열 취득해, 결합해 2차원 배열을 만든 후, 리스트안의 리스트에 있는 최종열이 중복하고 있는 리스트를 제거하고 CSV로 내보내는 도구를 만들고 싶었습니다.
 하고 싶은 일
 예: CSV를 로드하여 이런 느낌의 2차원 배열을 만듭니다.
[["A", "B", "C", "D", "1"], ["D", "F", "G", "A", "2"], ["O", "P", "Q", "C", "1"], ["L", "M", "T", "H", "2"], ["A", "B", "Z", "D", "3"]]
1열
2열
3열
4열
5열
A
B
C
D
1
D
F
G
A
2
O
P
Q
C
1
L
M
T
H
2
A
B
Z
D
3
이 다섯 번째 열의 중복 목록을 다음과 같이 제거합니다 (하나 남아 있으면 순서가 변경 될 수 있음)
[["A", "B", "C", "D", "1"], ["D", "F", "G", "A", "2"], ["A", "B", "Z", "D", "3"]]
1열
2열
3열
4열
5열
A
B
C
D
1
D
F
G
A
2
A
B
Z
D
3
즉, 단순하게 list(set(lst)) 를 사용할 수 없다···.
그래서 처음에는 다음과 같은 느낌의 코드를 써 보았다.
import csv
from glob import glob
col5 = []
def main():
    path = "/hogeDir"
    pathList = glob(f"{path}/*.csv")
    lst = []
    for pl in pathList:
        lst += inputCsv(pl)
    print(deduplicationList(lst))
def inputCsv(path: str) -> list:
    lst = []
    lst2 = []
    with open(path) as f:
        reader = csv.reader(f)
        next(reader)
        for line in reader:
            lst += line
            lst2 += [line[4]]
            col5 += line[4]
    return joinList(lst, lst2)
def joinList(lst1: list, lst2: list) -> list:
    tmpList = []
    for i, l in zip(lst1, lst2):
        tmpList = [i + l]
    return tmpList
def deduplicationList(lst: list) -> list:
    tmplist = lst
    for i, v in enumerate(tmplist):
        if v == col5[i]:
            lst.pop(i)
            col5.pop(i)
    return lst
if __name__ == "__main__":
    main()
일단 CSV 전부를 취득해 연결한 후, main() 의 lst 와 col5왠지 인덱스 에러나 원래 lst 와 col5 의 길이가 일치하지 않는다.
같은 CSV를 읽고 함께 pop() 하고 있을 것인데 어쩐지 잘 되지 않는다・・・.
 pandas를 사용하여 중복 목록 제거
버그가 고치지 않고, 시간이 걸려 버렸기 때문에, 이미 포기하고 다른 방법을 생각하려고 Web를 모색해, 이하의 기사를 발견했다.
 csv 데이터가 중복됩니다 ~ -> 그것, pandas로 제외
과연, pandas를 사용하면 제거할 수 있을까!
하지만 2차원 배열은 어떻습니까… 
더 모색했다.
 pandas.DataFrame, Series의 중복 행을 추출 및 삭제
list를 pandas로 읽어들여 duplicated즉시 써 보았다.
import pandas as pd
def main():
    path = "/hogeDir"
    pathList = glob(f"{path}/*.csv")
    pdlist = pd.DataFrame([], columns=["1列", "2列", "3列", "4列", "5列"])
    for pl in pathList:
        pd.concat(pdlist, pd.DataFrame(inputCsv(pl), columns=["1列", "2列", "3列", "4列", "5列"]))
    pdlist = pdlist.drop_duplicates(subset="5列", keep="first")
    pdlist.to_csv(f"{path}/output.csv", index=False)
굉장히 간단했다…게다가 약 2000행 읽고 있을 것인데 빠르다!
온순하게 pandas를 사용하면 좋았다.
 요약
결과적으로 하고 싶은 것이 한 줄로 되어 버렸다. 게다가 빠르다.
pandas 다양한 
 참고 사이트
 csv 데이터가 중복됩니다 ~ -> 그것, pandas로 제외
 pandas.DataFrame, Series의 중복 행을 추출 및 삭제
 [python] 사전에서 동일한 키에 여러 값을 등록합니다.
 【추기】Dictionary를 사용해 중복되지 않는 리스트의 작성
사전형에는 하나의 키에는 하나의 값만 등록되어 덮어씁니다.
즉, CSV를 읽을 때 중복하고 싶지 않은 값을 Key로 등록하면 중복되지 않는 목록을 만들 수 있습니다.
from collections import defaultdict
def main():
    path = "/hogeDir"
    dic = defaultdict(list)
    pathList = glob(f"{path}/*.csv")
    for pl in pathList:
        dic.update(inputCsv(pl))
    print(dic.values())
def inputCsv(path: str):
    inputDic = defaultdict(list)
    with open(path) as f:
        reader = csv.reader(f)
        next(reader)
        for line in reader:
            inputDic[line[4]] = line
    return inputDic
이번 경우, 총 2000행 이상의 CSV를 읽고 있었으므로, 그 경우 pandas를 사용하는 것이 빠릅니다만,
그렇게 많지 않은 경우는 이 방법을 사용해도 좋을지도 모릅니다.
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(CSV를 읽고 중복 요소를 포함하는 목록을 제거하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/yoshi_782/items/9fe187c63b5c12fa1d36
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
예: CSV를 로드하여 이런 느낌의 2차원 배열을 만듭니다.
[["A", "B", "C", "D", "1"], ["D", "F", "G", "A", "2"], ["O", "P", "Q", "C", "1"], ["L", "M", "T", "H", "2"], ["A", "B", "Z", "D", "3"]]
1열
2열
3열
4열
5열
A
B
C
D
1
D
F
G
A
2
O
P
Q
C
1
L
M
T
H
2
A
B
Z
D
3
이 다섯 번째 열의 중복 목록을 다음과 같이 제거합니다 (하나 남아 있으면 순서가 변경 될 수 있음)
[["A", "B", "C", "D", "1"], ["D", "F", "G", "A", "2"], ["A", "B", "Z", "D", "3"]]
1열
2열
3열
4열
5열
A
B
C
D
1
D
F
G
A
2
A
B
Z
D
3
즉, 단순하게
list(set(lst)) 를 사용할 수 없다···.그래서 처음에는 다음과 같은 느낌의 코드를 써 보았다.
import csv
from glob import glob
col5 = []
def main():
    path = "/hogeDir"
    pathList = glob(f"{path}/*.csv")
    lst = []
    for pl in pathList:
        lst += inputCsv(pl)
    print(deduplicationList(lst))
def inputCsv(path: str) -> list:
    lst = []
    lst2 = []
    with open(path) as f:
        reader = csv.reader(f)
        next(reader)
        for line in reader:
            lst += line
            lst2 += [line[4]]
            col5 += line[4]
    return joinList(lst, lst2)
def joinList(lst1: list, lst2: list) -> list:
    tmpList = []
    for i, l in zip(lst1, lst2):
        tmpList = [i + l]
    return tmpList
def deduplicationList(lst: list) -> list:
    tmplist = lst
    for i, v in enumerate(tmplist):
        if v == col5[i]:
            lst.pop(i)
            col5.pop(i)
    return lst
if __name__ == "__main__":
    main()
일단 CSV 전부를 취득해 연결한 후,
main() 의 lst 와 col5왠지 인덱스 에러나 원래 lst 와 col5 의 길이가 일치하지 않는다.같은 CSV를 읽고 함께 pop() 하고 있을 것인데 어쩐지 잘 되지 않는다・・・.
pandas를 사용하여 중복 목록 제거
버그가 고치지 않고, 시간이 걸려 버렸기 때문에, 이미 포기하고 다른 방법을 생각하려고 Web를 모색해, 이하의 기사를 발견했다.
 csv 데이터가 중복됩니다 ~ -> 그것, pandas로 제외
과연, pandas를 사용하면 제거할 수 있을까!
하지만 2차원 배열은 어떻습니까… 
더 모색했다.
 pandas.DataFrame, Series의 중복 행을 추출 및 삭제
list를 pandas로 읽어들여 duplicated즉시 써 보았다.
import pandas as pd
def main():
    path = "/hogeDir"
    pathList = glob(f"{path}/*.csv")
    pdlist = pd.DataFrame([], columns=["1列", "2列", "3列", "4列", "5列"])
    for pl in pathList:
        pd.concat(pdlist, pd.DataFrame(inputCsv(pl), columns=["1列", "2列", "3列", "4列", "5列"]))
    pdlist = pdlist.drop_duplicates(subset="5列", keep="first")
    pdlist.to_csv(f"{path}/output.csv", index=False)
굉장히 간단했다…게다가 약 2000행 읽고 있을 것인데 빠르다!
온순하게 pandas를 사용하면 좋았다.
 요약
결과적으로 하고 싶은 것이 한 줄로 되어 버렸다. 게다가 빠르다.
pandas 다양한 
 참고 사이트
 csv 데이터가 중복됩니다 ~ -> 그것, pandas로 제외
 pandas.DataFrame, Series의 중복 행을 추출 및 삭제
 [python] 사전에서 동일한 키에 여러 값을 등록합니다.
 【추기】Dictionary를 사용해 중복되지 않는 리스트의 작성
사전형에는 하나의 키에는 하나의 값만 등록되어 덮어씁니다.
즉, CSV를 읽을 때 중복하고 싶지 않은 값을 Key로 등록하면 중복되지 않는 목록을 만들 수 있습니다.
from collections import defaultdict
def main():
    path = "/hogeDir"
    dic = defaultdict(list)
    pathList = glob(f"{path}/*.csv")
    for pl in pathList:
        dic.update(inputCsv(pl))
    print(dic.values())
def inputCsv(path: str):
    inputDic = defaultdict(list)
    with open(path) as f:
        reader = csv.reader(f)
        next(reader)
        for line in reader:
            inputDic[line[4]] = line
    return inputDic
이번 경우, 총 2000행 이상의 CSV를 읽고 있었으므로, 그 경우 pandas를 사용하는 것이 빠릅니다만,
그렇게 많지 않은 경우는 이 방법을 사용해도 좋을지도 모릅니다.
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(CSV를 읽고 중복 요소를 포함하는 목록을 제거하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/yoshi_782/items/9fe187c63b5c12fa1d36
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
import pandas as pd
def main():
    path = "/hogeDir"
    pathList = glob(f"{path}/*.csv")
    pdlist = pd.DataFrame([], columns=["1列", "2列", "3列", "4列", "5列"])
    for pl in pathList:
        pd.concat(pdlist, pd.DataFrame(inputCsv(pl), columns=["1列", "2列", "3列", "4列", "5列"]))
    pdlist = pdlist.drop_duplicates(subset="5列", keep="first")
    pdlist.to_csv(f"{path}/output.csv", index=False)
결과적으로 하고 싶은 것이 한 줄로 되어 버렸다. 게다가 빠르다.
pandas 다양한

참고 사이트
 csv 데이터가 중복됩니다 ~ -> 그것, pandas로 제외
 pandas.DataFrame, Series의 중복 행을 추출 및 삭제
 [python] 사전에서 동일한 키에 여러 값을 등록합니다.
 【추기】Dictionary를 사용해 중복되지 않는 리스트의 작성
사전형에는 하나의 키에는 하나의 값만 등록되어 덮어씁니다.
즉, CSV를 읽을 때 중복하고 싶지 않은 값을 Key로 등록하면 중복되지 않는 목록을 만들 수 있습니다.
from collections import defaultdict
def main():
    path = "/hogeDir"
    dic = defaultdict(list)
    pathList = glob(f"{path}/*.csv")
    for pl in pathList:
        dic.update(inputCsv(pl))
    print(dic.values())
def inputCsv(path: str):
    inputDic = defaultdict(list)
    with open(path) as f:
        reader = csv.reader(f)
        next(reader)
        for line in reader:
            inputDic[line[4]] = line
    return inputDic
이번 경우, 총 2000행 이상의 CSV를 읽고 있었으므로, 그 경우 pandas를 사용하는 것이 빠릅니다만,
그렇게 많지 않은 경우는 이 방법을 사용해도 좋을지도 모릅니다.
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(CSV를 읽고 중복 요소를 포함하는 목록을 제거하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/yoshi_782/items/9fe187c63b5c12fa1d36
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
사전형에는 하나의 키에는 하나의 값만 등록되어 덮어씁니다.
즉, CSV를 읽을 때 중복하고 싶지 않은 값을 Key로 등록하면 중복되지 않는 목록을 만들 수 있습니다.
from collections import defaultdict
def main():
    path = "/hogeDir"
    dic = defaultdict(list)
    pathList = glob(f"{path}/*.csv")
    for pl in pathList:
        dic.update(inputCsv(pl))
    print(dic.values())
def inputCsv(path: str):
    inputDic = defaultdict(list)
    with open(path) as f:
        reader = csv.reader(f)
        next(reader)
        for line in reader:
            inputDic[line[4]] = line
    return inputDic
이번 경우, 총 2000행 이상의 CSV를 읽고 있었으므로, 그 경우 pandas를 사용하는 것이 빠릅니다만,
그렇게 많지 않은 경우는 이 방법을 사용해도 좋을지도 모릅니다.
Reference
이 문제에 관하여(CSV를 읽고 중복 요소를 포함하는 목록을 제거하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yoshi_782/items/9fe187c63b5c12fa1d36텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)