2013-02-22 48 views
34

Tôi cần phải tạo một khung dữ liệu bằng cách sử dụng dữ liệu được lưu trữ trong một tệp. Cho rằng tôi muốn sử dụng phương pháp read_csv. Tuy nhiên, phân cách không phải là rất thường xuyên. Một số cột được phân tách bằng các tab (\t), các cột khác được phân tách bằng dấu cách. Hơn nữa, một số cột có thể được phân cách bằng 2 hoặc 3 hoặc nhiều không gian hơn hoặc thậm chí bằng cách kết hợp khoảng trống và tab (ví dụ 3 dấu cách, hai tab và sau đó 1 khoảng trắng).Làm cách nào để tạo dấu phân tách trong read_csv khoảng trắng wrt linh hoạt hơn?

Có cách nào để yêu cầu gấu trúc xử lý các tệp này đúng cách không?

Nhân tiện, tôi không gặp vấn đề này nếu tôi sử dụng Python. Tôi sử dụng:

for line in file(file_name): 
    fld = line.split() 

Và nó hoạt động hoàn hảo. Nó không quan tâm nếu có 2 hoặc 3 khoảng trống giữa các trường. Ngay cả sự kết hợp của không gian và các tab không gây ra bất kỳ vấn đề nào. Gấu trúc có thể làm giống nhau không?

Trả lời

58

Từ documentation, bạn có thể sử dụng một regex hoặc delim_whitespace:

>>> import pandas as pd 
>>> for line in open("whitespace.csv"): 
...  print repr(line) 
...  
'a\t b\tc 1 2\n' 
'd\t e\tf 3 4\n' 
>>> pd.read_csv("whitespace.csv", header=None, delimiter=r"\s+") 
    0 1 2 3 4 
0 a b c 1 2 
1 d e f 3 4 
>>> pd.read_csv("whitespace.csv", header=None, delim_whitespace=True) 
    0 1 2 3 4 
0 a b c 1 2 
1 d e f 3 4 
+1

Bạn cũng có thể sử dụng 'skipinitialspace' để bỏ qua không gian ban đầu – jarondl

5
>>> pd.read_csv("whitespace.csv", header = None, sep = "\s+|\t+|\s+\t+|\t+\s+") 

sẽ sử dụng bất kỳ sự kết hợp của bất kỳ số lượng không gian và các tab như tách.

0

Chúng tôi có thể xem xét việc này để xử lý tất cả các kết hợp và không hoặc nhiều lần xuất hiện.

pd.read_csv("whitespace.csv", header = None, sep = "[ \t]*,[ \t]*") 
0

Pandas có hai độc giả csv, chỉ là linh hoạt về khoảng trắng dư thừa hàng đầu:

pd.read_csv("whitespace.csv", skipinitialspace=True) 

trong khi người ta không là

pd.DataFrame.from_csv("whitespace.csv") 

Cả là out-of-the-box linh hoạt về dấu khoảng trắng, xem câu trả lời với cụm từ thông dụng. Tránh delim_whitespace, vì nó cũng cho phép chỉ các dấu cách (không có hoặc \ t) làm dấu tách.

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