Tôi mới làm quen với Python và muốn tạo một khung dữ liệu từ hai danh sách bên dưới.
Tôi chưa quen với điều này và tôi muốn tạo một khung dữ liệu từ hai danh sách bên dưới.
my_foldername = ['thư_mục1','thư_mục2']
my_filetype = ['avi.txt','bmp.txt','exe.txt','avi.txt','bmp.txt','exe.txt']
đây là dòng mã hiện tại của tôi.
Dưới đây là các dòng mã hiện tại của tôi.
df = pd.DataFrame(danh sách(zip(tên_máy_chủ_của_tôi,Kiểu_tệp_của_tôi)))
Tôi muốn có loại đầu ra này.
Tôi muốn sản lượng này.
| -------- | -------- | -------- | -------- |
|Tên thư mục| AVI | BMP | EXE |
| -------- | -------- | -------- | -------- |
| thư mục1 | avi.txt | bmp.txt | exe.txt |
| -------- | -------- | -------- | -------- |
| thư mục2 | avi.txt | bmp.txt | exe.txt |
| -------- | -------- | -------- | -------- |
Thêm câu trả lời
Nếu bạn bao quanh mã của mình trong ``` ```, nó sẽ hiển thị dưới dạng mã trong bài đăng. Vui lòng chỉnh sửa để mã của bạn có thể đọc được.
Nếu bạn đặt mã vào ` thì nó sẽ được hiển thị dưới dạng mã trong POST. Vui lòng chỉnh sửa để làm cho mã của bạn có thể đọc được.
Bạn có thể sử dụng khóa kéo
như bạn đã thử, nhưng trước tiên bạn cần phải chia danh sách thứ hai thành từng phần. Trong python 3.12+, điều này dễ dàng thực hiện với itertools.batched
:
Bạn có thể thử sử dụng Zip, nhưng trước tiên bạn cần chia danh sách thứ hai thành nhiều phần. Trong python3.12+, điều này có thể được thực hiện dễ dàng bằng các trình vòng lặp. Xử lý hàng loạt:
từ itertools nhập hàng loạt
n = len(kiểu_tệp_của_tôi)//len(tên_thư_mục_của_tôi)
ra = pd.DataFrame([[f, *t] cho f,t
trong zip(my_foldername, batched(my_filetype, n))],
columns=['Tên Thư Mục', 'AVI', 'BMP', 'EXE'])
Đầu ra:
đầu ra:
Tên thư mục AVI BMP EXE
0 thư mục1 avi.txt bmp.txt exe.txt
1 thư mục2 avi.txt bmp.txt exe.txt00
Nếu bạn không có phiên bản python mới nhất (<3.12), hãy sử dụng theo đợt
công thức:
Nếu bạn không có phiên bản Python mới nhất (dưới 3.12), hãy sử dụng công thức hàng loạt:
từ itertools nhập islice
def batched(có thể lặp lại, n):
# batched('ABCDEFG', 3) --> ABC DEF G
nếu n < 1:
raise ValueError('n phải có ít nhất một')
it = iter(có thể lặp lại)
trong khi batch := tuple(islice(it, n)):
sản lượng hàng loạt
Ngoài ra, với một vòng lặp đơn giản và liệt kê
:
Hoặc, sử dụng một vòng lặp và liệt kê đơn giản:
n = len(kiểu_tệp_của_tôi)//len(tên_thư_mục_của_tôi)
ra = pd.DataFrame([[f, *my_filetype[i*n:(i+1)*n]] cho i,f
trong enumerate(my_foldername)],
columns=['Tên Thư Mục', 'AVI', 'BMP', 'EXE'])
Bạn có thể sử dụng numpy. định hình lại
để thay đổi loại_tệp_của_tôi
vào một mảng 2 x 3:
Bạn có thể sử dụng numpy.reshape để thay đổi my_filetype thành mảng 2 x 3:
df = pd. DataFrame(
np.reshape(my_filetype, (2, 3)),
cột=["AVI", "BMP", "EXE"],
index=pd.Series(tên_thư_mục_của_tôi, tên="Tên_thư_mục"),
).Đặt lại chỉ mục()
Nếu như loại_tệp_của_tôi
có nhiều phần tử hơn và bạn không muốn tính toán số hàng theo cách thủ công, bạn có thể cung cấp -1 để yêu cầu numpy thực hiện việc này cho bạn:
Nếu my_filetype chứa nhiều phần tử hơn và bạn không muốn đếm các hàng theo cách thủ công, bạn có thể cung cấp -1 để yêu cầu Numpy đếm các hàng cho bạn:
np.reshape(my_filetype, (-1, 3))
Trước tiên, bạn có thể tạo một từ điển rồi chuyển đổi nó thành DataFrame bằng thư viện Pandas như sau:
Trước tiên, bạn có thể tạo từ điển rồi chuyển đổi nó thành DataFrame bằng thư viện Pandas như sau:
nhập pandas dưới dạng pd
my_foldername = ['thư mục1', 'thư mục2']
my_filetype = ['avi.txt', 'bmp.txt', 'exe.txt', 'avi.txt', 'bmp.txt', 'exe.txt']
dữ liệu = {}
đối với file_type trong my_filetype:
file_extension = file_type.split('.')[0].upper()
dữ liệu[phần mở rộng_tệp] = dữ liệu.get(phần mở rộng_tệp, []) + [kiểu_tệp]
df = pd.DataFrame(dữ liệu)
df.insert(0, 'Tên_thư_mục', tên_thư_mục_của_tôi)
df = df.fillna('')
in(df)
Đây là kết quả đầu ra của đoạn mã trên:
Đây là đầu ra của đoạn mã trên:

Thêm câu trả lời
Sử dụng len(cột)
thay vì 3
có thể chung chung hơn nữa
Có thể tổng quát hơn khi sử dụng len(columns) thay vì 3
Tôi là một lập trình viên xuất sắc, rất giỏi!