Thêm các khung dữ liệu gấu trúc được tạo trong vòng lặp for


82

Tôi đang truy cập một loạt tệp Excel trong vòng lặp for. Sau đó, tôi đọc dữ liệu trong tệp excel sang khung dữ liệu gấu trúc. Tôi không thể tìm ra cách nối các khung dữ liệu này lại với nhau để sau đó lưu khung dữ liệu (hiện chứa dữ liệu từ tất cả các tệp) dưới dạng tệp Excel mới.

Đây là những gì tôi đã thử:

for infile in glob.glob("*.xlsx"):
    data = pandas.read_excel(infile)
    appended_data = pandas.DataFrame.append(data) # requires at least two arguments
appended_data.to_excel("appended.xlsx")

Cảm ơn!

Câu trả lời:


163

Sử dụng pd.concatđể hợp nhất danh sách DataFrame thành một DataFrame lớn duy nhất.

appended_data = []
for infile in glob.glob("*.xlsx"):
    data = pandas.read_excel(infile)
    # store DataFrame in list
    appended_data.append(data)
# see pd.concat documentation for more info
appended_data = pd.concat(appended_data)
# write DataFrame to an excel sheet 
appended_data.to_excel('appended.xlsx')

1
Tuyệt vời, cảm ơn. Bạn có biết có cách nào dễ dàng để thêm số nhận dạng cho từng DataFrame vào tệp excel cuối cùng không? Mục đích là có thể theo dõi dữ liệu đến từ tệp nào.
El Confuso

4
Thêm một cột mới với tên tệp khi bạn đọc dữ liệu. Có thể là một cái gì đó đơn giản như data['filename'] = infile.
biobirdman

1
Tuyệt quá! Cảm ơn nhiều. Nếu bất cứ ai trong tương lai muốn thử loại này chỉ cần thay thế ]bằng một phi superscript :)
El Confuso

6
@FaCoffee, xóa axis=1mã khỏi mã để liên kết các dfs bên dưới với nhau. :)
anky

2
Trừ khi được chỉ định khác, tôi nghĩ rằng "chắp thêm" có nghĩa là theo hàng, không phải cột và khuyên bạn nên xóa axis=1khỏi câu trả lời này.
Max Ghenis

42

bạn có thể thử cái này.

data_you_need=pd.DataFrame()
for infile in glob.glob("*.xlsx"):
    data = pandas.read_excel(infile)
    data_you_need=data_you_need.append(data,ignore_index=True)

Tôi hy vọng nó có thể giúp ích.



Cảm ơn, anh chàng, nó rất hữu ích
ngươi Jiawei

1
Xin chào @Ilya - giả sử bạn đang đề cập đến bài đăng của alexander trong liên kết - hiệu suất được tham chiếu chậm hơn là do sử dụng DataFrame.appendhoạt động thay vì list.appendhoạt động - không phải vì DataFrame.appendhoạt động thay vì DataFrame.concathoạt động.
Charlie

Tôi không chắc python quản lý bộ nhớ như thế nào, nhưng tôi mong đợi rằng hoạt động nối thêm sẽ sử dụng lượng bộ nhớ nhỏ hơn hoặc bằng (vì thông tin không liên quan được thu thập rác) và hoạt động kết hợp có thể sử dụng chắp thêm 'chui' đến rất ít, có thể không cải thiện hiệu suất (và có thể hiệu suất kém hơn do yêu cầu bộ nhớ lớn hơn).
Charlie

2
tôi đã thử điều này nhưng data_you_need của tôi trống. không biết có chuyện gì xảy ra
Duckman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.