2013-10-20 17 views
15

Sử dụng python 2.7.5 và gấu trúc 0.12.0, tôi đang cố gắng nhập tệp văn bản có độ rộng cố định thành DataFrame với 'pd.io .parsers.read_fwf() '. Các giá trị tôi nhập đều là số, nhưng điều quan trọng là số 0 đứng đầu được giữ nguyên, vì vậy tôi muốn chỉ định dtype làm chuỗi thay vì int.lỗi python read_fwf: 'dtype không được hỗ trợ với trình phân tích cú pháp python-fwf'

Theo documentation for this function, thuộc tính dtype được hỗ trợ trong read_fwf, nhưng khi tôi cố gắng sử dụng nó:

data= pd.io.parsers.read_fwf(file, colspecs = ([79,81], [87,90]), header = None, dtype = {0: np.str, 1: np.str})

tôi nhận được lỗi:

ValueError: dtype is not supported with python-fwf parser

tôi đã thử nhiều biến thể như tôi có thể nghĩ đến để thiết lập 'dtype = something', nhưng tất cả chúng đều trả về cùng một thông điệp.

Mọi trợ giúp sẽ được đánh giá cao!

Trả lời

8

Thay vì quy định cụ thể dtypes, chỉ định một chuyển đổi cho cột bạn muốn giữ lại như str, xây dựng trên @ dụ TomAugspurger của:

from io import StringIO 
import pandas as pd 
data = StringIO(u""" 
1213
12130
121300012 
""") 

pd.read_fwf(data, colspecs=[(0,3),(4,8)], converters = {1: str}) 

Dẫn đến

\n Unnamed: 1 
0 121 
1 121  0012 
2 121  0001 

chuyển đổi là một ánh xạ từ một tên cột hoặc chỉ mục cho một hàm để chuyển đổi giá trị trong ô (ví dụ: int sẽ chuyển đổi chúng thành số nguyên, float sang phao, v.v.)

4

Tài liệu có thể không chính xác tại đó. Tôi nghĩ rằng cùng một docstring cơ sở được sử dụng cho một số độc giả. Đối với một cách giải quyết, vì bạn biết chiều rộng trước thời hạn, tôi nghĩ bạn có thể thêm các số 0 sau khi thực tế.

Với tập tin này và độ rộng [4, 5]

1213
12130
121300012 

chúng tôi nhận được:

In [38]: df = pd.read_fwf('tst.fwf', widths=[4,5], header=None) 

In [39]: df 
Out[39]: 
     0  1 
0 1213 1234 
1 1213 123 
2 1213 12 

Để điền vào các số không thiếu, sẽ làm việc này?

In [45]: df[1] = df[1].astype('str') 

In [53]: df[1] = df[1].apply(lambda x: ''.join(['0'] * (5 - len(x))) + x) 

In [54]: df 
Out[54]: 
     0  1 
0 1213
1 1213 0
2 1213 00012 

Số 5 trong lambda ở trên có chiều rộng chính xác. Bạn cần phải chọn tất cả các cột cần số 0 đứng đầu và áp dụng hàm (với chiều rộng chính xác) cho mỗi cột.

+0

Tôi đồng ý với việc bạn đọc tài liệu. Tôi có thể đã nâng một 'NotImplementedError' thay vì' ValueError' thay vì làm cho nó rõ ràng hơn. – DSM

+0

Thức ăn khô cho một yêu cầu kéo. Luôn cân bằng giữa việc cố gắng sử dụng tài liệu có thể tái sử dụng và hiển thị đúng nội dung. Phải là 'NotImplementedError' hoặc' TypeError'. Nên tương đối đơn giản. @DSM - quan tâm? –

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