Hướng dẫn này là một tập hợp con nhỏ của một dự án mà tôi đã thực hiện gần đây. Nhiệm vụ ở đây là hợp nhất dữ liệu từ nhiều tệp csv thành một tệp sao cho không có thông tin nào bị mất và việc hợp nhất các cột từ tất cả các tệp được thực hiện mà không có bất kỳ sự mâu thuẫn nào
Giới thiệuBạn đã bao giờ gặp trường hợp có nhiều bảng có một cột chung và phải hợp nhất chúng dựa trên khóa chính chưa? . Có, nhưng điều gì sẽ xảy ra nếu tôi nói rằng chúng ta có mỗi bảng được lưu trữ trong một tệp csv, vì vậy mỗi tệp csv là một bảng. Và có 10 csv trong 5 thư mục khác nhau tức là. 50 tệp csv trong tất cả. Nhiệm vụ ở đây là hợp nhất tất cả csv trong mỗi thư mục và tạo một csv chính để cuối cùng chúng ta sẽ có 5 tệp csv chính. Tập dữ liệu ở đây liên quan đến lưu lượng truy cập trang web
Về dữ liệuHãy để tôi cung cấp cho bạn một cái nhìn nhanh về cấu trúc thư mục
Năm > Lượt xem quốc gia > 10 tệp csv
Tương tự, cả 4 thư mục còn lại đều có cấu trúc tương tự. Tất cả csv đều có 2 cột, một cột là chính tham số và cột còn lại là giá trị hoặc số lần truy cập mà tham số nhận được. Mỗi tệp csv đại diện cho một năm. Số hàng có thể tăng hoặc giảm và một số hàng có thể lặp lại với các năm khác nhau. Do đó, chúng tôi cần đảm bảo tại thời điểm hợp nhất không có dữ liệu nào bị mất
Chúng ta có thể làm điều này bằng cách sử dụng SQL và để lại các phép nối ngoài hoặc sử dụng hàm VLookUp trong excel nhưng điều đó sẽ rất tốn thời gian. Đây, Python đến để giải cứu chúng tôi
Chúng tôi sẽ tự động hóa tác vụ này với python và tạo một chức năng sẽ lấy một đầu vào duy nhất làm đường dẫn của thư mục 'Năm' và tạo một csv chính mới trong mỗi thư mục con cho chúng tôi trong một cuộc gọi. Tích tụ đủ rồi, bắt tay vào việc nào
Nhập thư viện cần thiết
import pandas as pd
import os #provides functions necessary to interact with os
import glob #used to extract file paths that match specific pattern
import re #regular expression package
Cách tiếp cận- Chức năng của chúng tôi sẽ lặp qua tất cả các thư mục con có trong thư mục chính 'Năm'. Một danh sách 'sub_folders' sẽ lưu trữ tên của tất cả các thư mục con
- Trong mỗi thư mục con, chúng tôi sẽ lặp qua tất cả các tệp và lưu trữ từng đường dẫn tệp trong danh sách 'all_files'
- Dữ liệu của mỗi tệp sẽ được lưu trữ dưới dạng một khung dữ liệu và mỗi khung dữ liệu sẽ được lưu trữ trong một danh sách mới 'li'. Nói cách khác, chúng tôi sẽ tạo một danh sách trong đó mỗi chỉ mục đại diện cho một khung dữ liệu [csv]
- Chúng tôi cũng sẽ tạo một danh sách 'năm' sẽ chỉ trích xuất và lưu trữ năm từ tất cả các tên tệp csv bằng cách sử dụng thư viện 're'
- Sử dụng chỉ mục của danh sách 'li', chúng tôi sẽ hợp nhất từng khung dữ liệu với phép nối ngoài bên trái bắt đầu từ 2 chỉ mục đầu tiên và sau đó lặp lại cho đến khi kết thúc chỉ mục danh sách
- Sau khi chúng tôi tạo csv chính cuối cùng của mình, chúng tôi sẽ đổi tên tất cả các cột với sự trợ giúp của danh sách 'năm. ' Chúng tôi sẽ đặt tên cho tất cả các tệp trong thư mục con bằng tên thư mục tương ứng của chúng bằng cách sử dụng danh sách 'thư mục con' đã tạo trước đó
Chức năng của chúng tôi sẽ là một iterator. Ở đây, tôi sẽ hướng dẫn bạn qua một lần lặp lại để dễ hiểu và sau đó chúng tôi sẽ chuyển đổi nó thành một hàm động. Chúng ta sẽ sử dụng quá nhiều danh sách và vòng lặp for
Bước 1
Phân tích cú pháp thông qua thư mục chính 'Năm' và lưu trữ tên của tất cả các thư mục con trong danh sách
data_dir = r’E:\Year’
sub_folders = os.listdir[data_dir]
sub_folders
Bước 2
Lặp lại tất cả các tệp trong thư mục con 'Nhấp chuột' và lưu trữ đường dẫn tệp của chúng trong danh sách 'all_files'
path = os.path.join[data_dir, sub_folders[0]]
os.chdir[path]
all_files = glob.glob[path + “/*.csv”]
all_files
Bước 3
Tạo danh sách dữ liệu của tệp mới dưới dạng khung dữ liệu 'li'
li = []
for filename in all_files:
df = pd.read_csv[filename,on_bad_lines=’skip’,names=[‘Title’, ‘Frequency’]]
li.append[df]
li
li[0]
Nhìn thoáng qua chỉ mục đầu tiên trông như thế nào trong danh sách 'li'
Bước 4
Tạo một danh sách 'năm' sẽ trích xuất tất cả các năm từ tên tệp bằng thư viện re
year = []
for file in range[0,len[all_files]]:
x = re.search[“[0–5][0–9][0–5][0–9]”, all_files[file]]
year.append[x.group[]]
year
Bước 5
Hợp nhất tất cả dữ liệu từ mỗi khung dữ liệu với nối ngoài bên trái từng cái một bắt đầu từ chỉ mục 0 và 1. Trước đó, chúng tôi sẽ thêm thay thế tất cả các giá trị trống bằng 0 trong tất cả các khung dữ liệu
li[index].fillna[0]
li[index] = li[index].groupby[[‘Title’]].agg[‘sum’]left = li[0]
for i in range[0,len[year]-1]:
right = li[i+1]
result = pd.merge[left, right, on=”Title”, how=”outer”,suffixes= [year[i],year[i+1]]]
left = result
left.head[]
Bước 6
Hãy để chúng tôi đổi tên các cột khi tần suất được thêm vào tất cả các tên cột mới được tạo bằng phép nối
left.columns = year
left.head[]
Cuối cùng, chúng ta hãy xuất khung dữ liệu với tên tệp thích hợp trong thư mục con 'Nhấp chuột'
________số 8Như vậy là ta đã hoàn thành xuất sắc nhiệm vụ trong tay. Bây giờ chúng ta hãy đặt tất cả các đoạn mã trong một chức năng duy nhất
def combine_data[data_dir]:
os.chdir[data_dir]
sub_folders = os.listdir[data_dir] #list of sub_foldersfor folder in range[0,len[sub_folders]]: #loop through all sub_folders
path = os.path.join[data_dir, sub_folders[folder]]
os.chdir[path]
all_files = glob.glob[path + “/*.csv”] #list of all files in folderli = []
for filename in all_files:
df = pd.read_csv[filename,on_bad_lines=’skip’,names=[‘Title’, ‘Frequency’]]
li.append[df] #list li of df [each csv as 1 df at each index of li]
for index in range[0,len[all_files]]:
li[index].fillna[0]
li[index] = li[index].groupby[[‘Title’]].agg[‘sum’]year = []
for file in range[0,len[all_files]]:
x = re.search[“[0–5][0–9][0–5][0–9]”, all_files[file]]
year.append[x.group[]] #list of year fetched from .csv filenamesleft = li[0]
for i in range[0,len[year]-1]:
right = li[i+1]
result = pd.merge[left, right, on=”Title”, how=”outer”,suffixes=[year[i],year[i+1]]] #outer merge on 2 consecutive indexes of df
left = result#year.insert[0,’Title’]
left.columns = year #updating column names of master dfleft.to_csv[sub_folders[folder]+’.csv’] #exporting the df
gọi hàm
data_dir = r’E:\Year’
sub_folders = os.listdir[data_dir]
sub_folders
0Cảm ơn bạn đã đọc bài viết. Vui lòng liên hệ với bất kỳ mối quan tâm, làm rõ hoặc vấn đề bản quyền nào trên kakadiya95@gmail. com. Ngoài ra, bạn có thể nhắn tin cho tôi trên trang Linkedin của tôi. Ngoài ra, hãy kiểm tra tài khoản github của tôi