CSV 처리를 위한 10가지 유용한 Python One-Liner


편집자 이미지
# 소개
CSV 파일은 데이터베이스 내보내기부터 API 응답, 스프레드시트 다운로드까지 데이터 워크플로의 모든 곳에 있습니다. Pandas는 훌륭하게 작동하지만 때로는 Pandas를 설치하지 않고도 Python을 사용하여 코딩할 수 있는 빠른 솔루션이 필요합니다.
목록 이해 및 생성기 표현식과 결합된 Python의 내장 csv 모듈은 한 줄의 코드로 가장 일반적인 CSV 작업을 처리할 수 있습니다. 이러한 단일 라이너는 빠른 데이터 탐색, ETL 디버깅 또는 외부 라이브러리를 사용할 수 없는 제한된 환경에서 작업할 때 적합합니다.
50개의 레코드가 있는 샘플 비즈니스 데이터 세트를 사용해 보겠습니다. 데이터.csv 그리고 시작하세요!
🔗 GitHub의 코드에 대한 링크
# 1. 열 합계 찾기
모든 행에 걸쳐 숫자 열의 합계를 계산합니다.
print(f"Total: ${sum(float(r[3]) for r in __import__('csv').reader(open(path)) if r[0] != 'transaction_id'):,.2f}")
여기, path
샘플 CSV 파일의 경로를 보유하는 변수입니다. 이 예에서는 Google Colab에서 다음과 같습니다. path = "/content/data.csv"
.
산출:
여기, __import__('csv')
내장 CSV 모듈을 인라인으로 가져옵니다. 생성기 표현식은 머리글 행을 건너뛰고, 열 값을 부동 소수점으로 변환하고, 합계를 내고, 통화 표기법으로 형식을 지정합니다. 필요에 따라 열 인덱스(3)와 헤더 확인을 조정합니다.
# 2. 최대 그룹화
데이터 세트 전체에서 집계 값이 가장 높은 그룹을 찾습니다.
print(max({r[5]: sum(float(row[3]) for row in __import__('csv').reader(open(path)) if row[5] == r[5] and row[0] != 'transaction_id') for r in __import__('csv').reader(open(path)) if r[0] != 'transaction_id'}.items(), key=lambda x: x[1]))
산출:
('Mike Rodriguez', 502252.0)
사전 이해는 열 5로 그룹화되어 각 그룹의 열 3 값을 합산합니다. 한 패스는 그룹 키를 수집하고 두 번째 패스는 집계를 수행합니다. max()
람다를 사용하면 가장 높은 합계를 찾습니다. 다양한 그룹화 작업에 대한 열 인덱스를 조정합니다.
# 3. 행의 하위 집합 필터링 및 표시
형식화된 출력으로 특정 조건과 일치하는 행만 표시합니다.
print("\n".join(f"{r[1]}: ${float(r[3]):,.2f}" for r in __import__('csv').reader(open(path)) if r[7] == 'Enterprise' and r[0] != 'transaction_id'))
산출:
Acme Corp: $45,000.00
Gamma Solutions: $78,900.00
Zeta Systems: $156,000.00
Iota Industries: $67,500.25
Kappa LLC: $91,200.75
Nu Technologies: $76,800.25
Omicron LLC: $128,900.00
Sigma Corp: $89,700.75
Phi Corp: $176,500.25
Omega Technologies: $134,600.50
Alpha Solutions: $71,200.25
Matrix Systems: $105,600.25
생성기 표현식은 열 7이 다음과 같은 행을 필터링합니다. Enterprise
그런 다음 열 1과 3의 형식을 지정합니다. "\n".join(...)
목록 인쇄를 방지합니다. None
가치.
# 4. 합계 분포별 그룹화
그룹화 열의 각 고유 값에 대한 합계를 가져옵니다.
print({g: f"${sum(float(row[3]) for row in __import__('csv').reader(open(path)) if row[6] == g and row[0] != 'transaction_id'):,.2f}" for g in set(row[6] for row in __import__('csv').reader(open(path)) if row[0] != 'transaction_id')})
산출:
{'Asia Pacific': '$326,551.75', 'Europe': '$502,252.00', 'North America': '$985,556.00'}
사전 컴프리헨션은 먼저 집합 컴프리헨션을 사용하여 6열에서 고유한 값을 추출한 다음 각 그룹에 대해 3열의 합을 계산합니다. 이는 생성기 표현식으로 인해 메모리 효율적입니다. 열 인덱스를 변경하여 다른 필드별로 그룹화합니다.
# 5. 정렬이 포함된 임계값 필터
특정 수치 임계값을 초과하는 모든 기록을 찾아 순위를 매깁니다.
print([(n, f"${v:,.2f}") for n, v in sorted([(r[1], float(r[3])) for r in list(__import__('csv').reader(open(path)))[1:] if float(r[3]) > 100000], key=lambda x: x[1], reverse=True)])
산출:
[('Phi Corp', '$176,500.25'), ('Zeta Systems', '$156,000.00'), ('Omega Technologies', '$134,600.50'), ('Omicron LLC', '$128,900.00'), ('Matrix Systems', '$105,600.25')]
열 3이 초과하는 행을 필터링합니다. 100000
이름과 숫자 값의 튜플을 생성하고 숫자 값을 기준으로 정렬한 다음 표시할 통화 형식으로 값을 지정합니다. 필요에 따라 임계값과 열을 조정합니다.
# 6. 고유한 값 계산
모든 열에 존재하는 고유 값 수를 빠르게 확인하세요.
print(len(set(r[2] for r in __import__('csv').reader(open(path)) if r[0] != 'transaction_id')))
산출:
여기서 집합 내포는 열 2에서 고유한 값을 추출합니다. len()
그들을 계산합니다. 이는 데이터 다양성을 확인하거나 고유한 범주를 찾는 데 유용합니다.
# 7. 조건부 집계
데이터의 특정 하위 집합에 대한 평균 또는 기타 통계를 계산합니다.
print(f"Average: ${sum(float(r[3]) for r in __import__('csv').reader(open(path)) if r[6] == 'North America' and r[0] != 'transaction_id') / sum(1 for r in __import__('csv').reader(open(path)) if r[6] == 'North America' and r[0] != 'transaction_id'):,.2f}")
산출:
이 단일 라이너는 열 6의 조건과 일치하는 행에 대한 열 3의 평균을 계산합니다. 이는 생성기 표현식을 통해 합계를 개수로 나눈 값을 사용합니다. 파일을 두 번 읽지만 메모리 사용량은 낮게 유지됩니다.
# 8. 다중 열 필터
여러 열에 동시에 여러 필터 조건을 적용합니다.
print("\n".join(f"{r[1]} | {r[2]} | ${float(r[3]):,.2f}" for r in __import__('csv').reader(open(path)) if r[2] == 'Software' and float(r[3]) > 50000 and r[0] != 'transaction_id'))
산출:
Zeta Systems | Software | $156,000.00
Iota Industries | Software | $67,500.25
Omicron LLC | Software | $128,900.00
Sigma Corp | Software | $89,700.75
Phi Corp | Software | $176,500.25
Omega Technologies | Software | $134,600.50
Nexus Corp | Software | $92,300.75
Apex Industries | Software | $57,800.00
여러 필터 조건을 다음과 결합합니다. and
연산자, 문자열 동일성 및 숫자 비교를 확인하고 깔끔한 표시를 위해 파이프 구분 기호로 출력 형식을 지정합니다.
# 9. 계산 열 통계
숫자 열에 대한 최소, 최대 및 평균 통계를 한 번에 생성합니다.
vals = [float(r[3]) for r in __import__('csv').reader(open(path)) if r[0] != 'transaction_id']; print(f"Min: ${min(vals):,.2f} | Max: ${max(vals):,.2f} | Avg: ${sum(vals)/len(vals):,.2f}"); print(vals)
산출:
Min: $8,750.25 | Max: $176,500.25 | Avg: $62,564.13
[45000.0, 12500.5, 78900.0, 23400.75, 8750.25, 156000.0, 34500.5, 19800.0, 67500.25, 91200.75, 28750.0, 43200.5, 76800.25, 15600.75, 128900.0, 52300.5, 31200.25, 89700.75, 64800.0, 22450.5, 176500.25, 38900.75, 27300.0, 134600.5, 71200.25, 92300.75, 18900.5, 105600.25, 57800.0]
그러면 열 3의 숫자 값 목록이 생성된 다음 한 줄에 최소값, 최대값 및 평균이 계산됩니다. 세미콜론은 명령문을 구분합니다. 스트리밍보다 메모리 집약적이지만 이러한 통계에 대한 다중 파일 읽기보다 빠릅니다.
# 10. 필터링된 데이터 내보내기
기준에 맞는 행만 포함된 새 CSV 파일을 만듭니다.
__import__('csv').writer(open('filtered.csv','w',newline="")).writerows([r for r in list(__import__('csv').reader(open(path)))[1:] if float(r[3]) > 75000])
CSV를 읽고 조건에 따라 행을 필터링한 후 새 파일에 씁니다. 그만큼 newline=""
매개변수는 추가 줄 바꿈을 방지합니다. 이 예에서는 헤더를 건너뛴다는 점에 유의하세요. [1:]
)이므로 출력에 헤더가 필요한 경우 명시적으로 포함하세요.
마무리
CSV 처리를 위한 이러한 단일 라이너가 도움이 되기를 바랍니다.
이러한 단일 라이너는 다음과 같은 경우에 유용합니다.
- 빠른 데이터 탐색 및 검증
- 간단한 데이터 변환
- 전체 스크립트를 작성하기 전에 프로토타이핑하기
하지만 다음과 같은 경우에는 피해야 합니다.
- 생산 데이터 처리
- 복잡한 오류 처리가 필요한 파일
- 다단계 변환
이러한 기술은 설정 오버헤드 없이 빠른 솔루션이 필요할 때 Python의 내장 CSV 모듈과 함께 작동합니다. 분석해 보세요!
발라 프리야 C 인도 출신의 개발자이자 기술 작가입니다. 그녀는 수학, 프로그래밍, 데이터 과학, 콘텐츠 제작의 교차점에서 일하는 것을 좋아합니다. 그녀의 관심 및 전문 분야에는 DevOps, 데이터 과학, 자연어 처리가 포함됩니다. 그녀는 읽기, 쓰기, 코딩, 커피를 즐깁니다! 현재 그녀는 튜토리얼, 방법 가이드, 의견 등을 작성하여 개발자 커뮤니티에서 자신의 지식을 학습하고 공유하는 데 힘쓰고 있습니다. Bala는 또한 매력적인 리소스 개요와 코딩 튜토리얼을 만듭니다.
Post Comment