2015-12-12 17 views
5

Tôi có n tệp trong thư mục mà tôi cần phải kết hợp thành một. Họ có cùng một số lượng cột, ví dụ, các nội dung của test1.csv là:sử dụng gấu trúc trong python để nối các tệp csv vào một

test1,test1,test1 
test1,test1,test1 
test1,test1,test1 

Tương tự như vậy, các nội dung của test2.csv là:

test2,test2,test2 
test2,test2,test2 
test2,test2,test2 

Tôi muốn final.csv trông như thế này:

test1,test1,test1 
test1,test1,test1 
test1,test1,test1 
test2,test2,test2 
test2,test2,test2 
test2,test2,test2 

Nhưng thay vì nói ra như thế này:

test file 1,test file 1.1,test file 1.2,test file 2,test file 2.1,test file 2.2 
,,,test file 2,test file 2,test file 2 
,,,test file 2,test file 2,test file 2 
test file 1,test file 1,test file 1,,, 
test file 1,test file 1,test file 1,,, 

Ai đó có thể giúp tôi tìm ra những gì đang xảy ra ở đây không? Tôi đã dán mã của tôi bên dưới:

import csv 
import glob 
import pandas as pd 
import numpy as np 

all_data = pd.DataFrame() #initializes DF which will hold aggregated csv files 

for f in glob.glob("*.csv"): #for all csv files in pwd 
    df = pd.read_csv(f) #create dataframe for reading current csv 
    all_data = all_data.append(df) #appends current csv to final DF 

all_data.to_csv("final.csv", index=None) 
+0

Tại sao bạn sử dụng gấu trúc chỉ để tạo một csv? –

+0

Tôi là một noob và tôi nghĩ đây là cách tốt nhất để làm điều đó. :/ –

Trả lời

5

Tôi nghĩ rằng có nhiều vấn đề:

  1. Tôi đã gỡ bỏ import csvimport numpy as np, bởi vì trong bản demo này, họ không được sử dụng (nhưng có lẽ họ trong mất tích, dòng để họ có thể được nhập khẩu)
  2. tôi đã tạo danh sách tất cả các khung dữ liệu dfs, trong đó các khung dữ liệu được nối thêm dfs.append(df). Sau đó, tôi đã sử dụng hàm concat để tham gia danh sách này vào khung dữ liệu cuối cùng.
  3. Trong chức năng read_csv Tôi đã thêm tham số header=None, bởi vì vấn đề chính là read_csv đọc hàng đầu tiên là header.
  4. Trong hàm to_csv Tôi đã thêm tham số header=None để bỏ tiêu đề.
  5. Tôi đã thêm thư mục test vào tệp đích cuối cùng, vì nếu sử dụng hàm glob.glob("*.csv") bạn nên đọc tệp đầu ra làm tệp đầu vào.

Giải pháp:

import glob 
import pandas as pd 

all_data = pd.DataFrame() #initializes DF which will hold aggregated csv files 

#list of all df 
dfs = [] 
for f in glob.glob("*.csv"): #for all csv files in pwd 
    #add parameters to read_csv 
    df = pd.read_csv(f, header=None) #create dataframe for reading current csv 
    #print df 
    dfs.append(df) #appends current csv to final DF 
all_data = pd.concat(dfs, ignore_index=True) 
print all_data 
#  0  1  2 
#0 test1 test1 test1 
#1 test1 test1 test1 
#2 test1 test1 test1 
#3 test2 test2 test2 
#4 test2 test2 test2 
#5 test2 test2 test2 
all_data.to_csv("test/final.csv", index=None, header=None) 

giải pháp tiếp theo là tương tự.
Tôi thêm thông số header=None vào read_csvto_csv và thêm thông số ignore_index=True vào append.

import glob 
import pandas as pd 

all_data = pd.DataFrame() #initializes DF which will hold aggregated csv files 

for f in glob.glob("*.csv"): #for all csv files in pwd 
    df = pd.read_csv(f, header=None) #create dataframe for reading current csv 
    all_data = all_data.append(df, ignore_index=True) #appends current csv to final DF 
print all_data 
#  0  1  2 
#0 test1 test1 test1 
#1 test1 test1 test1 
#2 test1 test1 test1 
#3 test2 test2 test2 
#4 test2 test2 test2 
#5 test2 test2 test2 

all_data.to_csv("test/final.csv", index=None, header=None) 
+0

Wow cảm ơn bạn! Tôi sẽ cố gắng tối nay! –

+1

Tôi nghĩ 'pandas' là thư viện rất tốt để xử lý dữ liệu. Vì vậy, bạn có thể thử nó. Và nếu bạn mới trong Stackoverflow, bạn có thể kiểm tra [this] (http://stackoverflow.com/tour). – jezrael

+0

Mặc dù có những giải thích tốt khác về các phương pháp hiệu quả hơn việc sử dụng gấu trúc trong bối cảnh này, giải pháp này hiệu quả nhất đối với tôi. –

2

Bạn có thể concat. Hãy df1 được dataframe đầu tiên của bạn và df2 thứ hai, bạn có thể:

df = pd.concat([df1,df2],ignore_index=True) 

Các ignore_index là không bắt buộc, bạn có thể thiết lập nó để True nếu bạn không nhớ các chỉ số ban đầu của dataframes duy nhất.

+1

Thao tác này sẽ hoạt động nếu bạn chuyển "trục = 0" làm thông số. – hahdawg

+0

@hahdawg cảm ơn vì đã chỉ ra. Trên thực tế 0 là giá trị mặc định cho 'axis' trong' concat'. –

+0

Cảm ơn bạn. Tôi sẽ cố gắng thực hiện điều này vào kịch bản của mình. –

1

pandas không phải là một công cụ để sử dụng khi tất cả các bạn muốn là tạo ra một tập tin csv duy nhất, bạn chỉ có thể viết mỗi csv vào một tập tin mới khi bạn đi:

import glob 

with open("out.csv","w") as out: 
    for fle in glob.glob("*.csv"): 
     with open(fle) as f: 
      out.writelines(f) 

Hoặc với lib csv nếu bạn thích:

import glob 
import csv 

with open("out.csv", "w") as out: 
    wr = csv.writer(out) 
    for fle in glob.glob("*.csv"): 
     with open(fle) as f: 
      wr.writerows(csv.reader(f)) 

Tạo một khung dữ liệu lớn để cuối cùng ghi vào đĩa không có ý nghĩa thực, hơn nữa nếu bạn có nhiều tệp không thể thực hiện được.

+0

OK. cảm ơn vì đã giúp tôi hiểu khái niệm. Dataframes là mới đối với tôi. –

+0

Không phải lo lắng, gấu trúc là một công cụ tuyệt vời nếu bạn thực sự muốn làm một số tính toán trên dữ liệu, nó không phải là công cụ để sử dụng để concat một vài tập tin vào một –

Các vấn đề liên quan