2017-01-23 7 views
0

私はフィールドが、そのようなことが欠けているオブジェクト0のように、既存のされていない問題に実行していますデータの読み込みや空の値を埋めるのPython

,abv,ibu,id,name,style,brewery_id,ounces 
14,0.061,60.0,1979,Bitter Bitch,American Pale Ale (APA),177,12.0 
0 , 0.05,, 1436, Pub Beer, American Pale Lager, 408, 12.0 

の一般的なスキーマを使用してCSVファイルに読んでいますIBU。私は浮動小数点を必要とする値のための浮動小数点として動作する0.0のような値と、文字列を必要とするもののための空の文字列を挿入できるようにしたいと思います。

私のコードは、エラーサインを投げるだろう、今の時点でどのようにすべき私のコードは、オブジェクト0

ための「IBU」欄の空値がある

import csv 
import numpy as np 

def dataset(path, filter_field, filter_value): 
    with open(path, 'r') as csvfile: 
    reader = csv.DictReader(csvfile) 
     if filter_field: 
     for row in filter(lambda row: row[filter_field]==filter_value, reader): 
      yield row 

def main(path): 
     data = [(row["ibu"], float(row["ibu"])) for row in dataset(path, "style", "American Pale Lager")] 

のラインに沿っていますこの問題を解決しようか?

答えて

1

あなたは、次のことが可能です。 あなたが欠落している値のため を使用することができ、デフォルトの辞書の入力を追加し、また、そのようなIBUが、これはあなたの実装が何を修正するために変更され、空の

あるときなど、特定の条件に更新しますあなたが必要です。私はあなたが私はパンダを使用した場合は...あなたは以下の

import pandas as pd 

df = pd.read_csv(data_file) 

を使用していないのはなぜ

import csv, copy 

def dataset(path, filter_field, filter_value, default={'brewery_id':-1, 'style': 'unkown style', ' ': -1, 'name': 'unkown name', 'abi':0.0, 'id': -1, 'ounces':-1, 'ibu':0.0}): 
with open(path, 'r') as csvfile: 
    reader = csv.DictReader(csvfile) 
    for row in reader: 
     if row is None: 
      break 
     if row[filter_field].strip() != filter_value: 
      continue 
     default_row = copy.copy(default) 
     default_row.update(row) 
     # you might want to add conditions 
     if default_row["ibu"] == "": 
      default_row["ibu"] = default["ibu"] 
     yield default_row 

data = [(row["ibu"], float(row["ibu"])) for row in dataset('test.csv', "style", "American Pale Lager")] 

print data 

>> [(0.0, 0.0)] 
1

は結果である:

In [13]: df 
Out[13]: 
    Unnamed: 0 abv ibu id   name     style \ 
0   14 0.061 60.0 1979 Bitter Bitch American Pale Ale (APA) 
1   0 0.050 NaN 1436  Pub Beer  American Pale Lager 

    brewery_id ounces 
0   177 12.0 
1   408 12.0 
1

は、テキストを使用してファイルをシミュレート文字列:

In [48]: txt=b""" ,abv,ibu,id,name,style,brewery_id,ounces 
    ...: 14,0.061,60.0,1979,Bitter Bitch,American Pale Ale (APA),177,12.0 
    ...: 0 , 0.05,, 1436, Pub Beer, American Pale Lager, 408, 12.0 
    ...: """ 

numpygenfromtxt

In [49]: data=np.genfromtxt(txt.splitlines(),delimiter=',',dtype=None,skip_heade 
    ...: r=1,filling_values=0) 

In [50]: data 
Out[50]: 
array([ (14, 0.061, 60., 1979, b'Bitter Bitch', b'American Pale Ale (APA)', 177, 12.), 
     (0, 0.05 , 0., 1436, b' Pub Beer', b' American Pale Lager', 408, 12.)], 
     dtype=[('f0', '<i4'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<i4'), ('f4', 'S12'), ('f5', 'S23'), ('f6', '<i4'), ('f7', '<f8')]) 
In [51]: 

ヘッダー行が不完全であるため(1番目のフィールドでは空白)、スキップする必要がありました。結果は構造化された配列です - int、float、およびstrings(Py3のバイトストリング)の組み合わせ。

ヘッダ行を補正し、names=Trueを使用した後、私は

array([ (14, 0.061, 60., 1979, b'Bitter Bitch', b'American Pale Ale (APA)', 177, 12.), 
     (0, 0.05 , 0., 1436, b' Pub Beer', b' American Pale Lager', 408, 12.)], 
     dtype=[('f0', '<i4'), ('abv', '<f8'), ('ibu', '<f8'), ('id', '<i4'), ('name', 'S12'), ('style', 'S23'), ('brewery_id', '<i4'), ('ounces', '<f8')]) 

genfromtxtを得るには、numpyで最も強力なcsvリーダーです。より多くのパラメータについては、ドキュメントを参照してください。 pandasリーダーはより高速で柔軟性がありますが、もちろん配列ではなくデータフレームを生成します。

関連する問題