2017-05-22 12 views
2

csvファイルからpandas.DataFrameを作成する必要があります。そのために私は方法pandas.csv_reader(...)を使用しています。このファイルの問題は、1つ以上の列に値の中にカンマが含まれていることです(ファイル形式を制御しません)。 私はこのquestionからソリューションを実装しようとしてきたが、私は次のエラーを取得:私は固定が空白になってみましたCSVファイルをこのソリューションを導入した後、何らかの理由でカンダでパンダでCSVファイルを解析する

pandas.errors.EmptyDataError: No columns to parse from file 

を。

# fix csv file 
with open ("/Users/username/works/test.csv",'rb') as f,\ 
open("/Users/username/works/test.csv",'wb') as g: 
    writer = csv.writer(g, delimiter=',') 
    for line in f: 
     row = line.split(',', 4) 
     writer.writerow(row) 
# Manipulate csv file 
data = pd.read_csv(os.path.expanduser\ 
("/Users/username/works/test.csv"),error_bad_lines=False) 

任意のアイデア:ここ

は、私が使用していますコードはありますか?

データの概要:

Id0 Id 1 Id 2 Country Company Title  Email     
    23 123  456 AR  name cargador [email protected]     

    24 123  456 AR  name Executive assistant [email protected]     

    25 123  456 AR  name Asistente Administrativo [email protected]     

    26 123  456 AR  name Atención al cliente vía telefónica vía online [email protected]    
    39 123  456 AR  name Asesor de ventas [email protected]     

    40 123  456 AR  name inc. International company representative [email protected]    
    41 123  456 AR  name Vendedor de campo [email protected]     

    42 123  456 AR  name PUBLICIDAD ATENCIÓN AL CLIENTE [email protected]    
    43 123  456 AR  name Asistente de Marketing [email protected]     

    44 123  456 AR  name SOLDADOR [email protected]     
    217 123  456 AR  name Se requiere vendedores  Loja Quevedo  Guayas) [email protected] 
    218 123  456 AR  name Ing. Civil recién graduado Yaruquí [email protected]    
219 123  456 AR  name ayudantes enfermeria [email protected]     

220 123  456 AR  name Trip Leader for International Youth Exchange [email protected]     
221 123  456 AR  name COUNTRY MANAGER/DIRECTOR COMERCIAL [email protected]     
250 123  456 AR  name Ayudante de Pasteleria [email protected] Asesor [email protected] [email protected]  

事前解析されたCSV:

#,Id 1,Id 2,Country,Company,Title,Email,,,, 
23,123,456,AR,name,cargador,[email protected],,,, 
24,123,456,AR,name,Executive assistant,[email protected],,,, 
25,123,456,AR,name,Asistente Administrativo,[email protected],,,, 
26,123,456,AR,name,Atención al cliente vía telefónica , vía online,[email protected],,, 
39,123,456,AR,name,Asesor de ventas,[email protected],,,, 
40,123,456,AR,name, inc.,International company representative,[email protected],,, 
41,123,456,AR,name,Vendedor de campo,[email protected],,,, 
42,123,456,AR,name,PUBLICIDAD, ATENCIÓN AL CLIENTE,[email protected],,, 
43,123,456,AR,name,Asistente de Marketing,[email protected],,,, 
44,123,456,AR,name,SOLDADOR,[email protected],,,, 
217,123,456,AR,name,Se requiere vendedores,, Loja , Quevedo, Guayas),[email protected] 
218,123,456,AR,name,Ing. Civil recién graduado, Yaruquí,[email protected],,, 
219,123,456,AR,name,ayudantes enfermeria,[email protected],,,, 
220,123,456,AR,name,Trip Leader for International Youth Exchange,[email protected],,,, 
221,123,456,AR,name,COUNTRY MANAGER/DIRECTOR COMERCIAL,[email protected],,,, 
250,123,456,AR,name,Ayudante de Pasteleria,[email protected], Asesor,[email protected],[email protected], 
251,123,456,AR,name,Ejecutiva de Ventas,[email protected],,,, 
+2

あなたは、ファイルのデータの概要を追加することはできますか? –

+0

私はデータの概要を追加しました。ありがとうございました – David

+2

@ChihebNexusは、あらかじめ解析されたCSVデータを要求していたので、正しく解析する方法がわかりました。 – pshep123

答えて

2

あなたは、任意のカンマはスペースが続いていることを、とびのためにそれを想定して、すべてのことができた場合残りの誤ったコンマのうち、電子メールアドレスより前の列にある場合は、小さなパーサを処理して処理することができます。

コード:

import csv 
import re 

VALID_EMAIL = re.compile(r'[^@][email protected][^@]+\.[^@]+') 

def read_my_csv(file_handle): 
    # build csv reader 
    reader = csv.reader(file_handle) 

    # get the header, and find the e-mail and title columns 
    header = next(reader) 
    email_column = header.index('Email') 
    title_column = header.index('Title') 

    # yield the header up to the e-mail column 
    yield header[:email_column+1] 

    # for each row, go through rebuild columns 
    for row in reader: 

     # for each row, put the Company column back together 
     while row[title_column].startswith(' '): 
      row[title_column-1] += ',' + row[title_column] 
      del row[title_column] 

     # for each row, put the Title column back together 
     while not VALID_EMAIL.match(row[email_column]): 
      row[email_column-1] += ',' + row[email_column] 
      del row[email_column] 
     yield row[:email_column+1] 

テストコード:

with open ("test.csv", 'rU') as f: 
    generator = read_my_csv(f) 
    columns = next(generator) 
    df = pd.DataFrame(generator, columns=columns) 

print(df) 

結果:

 # Id 1 Id 2 Country  Company \ 
0 23 123 456  AR  name 
1 24 123 456  AR  name 
2 25 123 456  AR  name 
3 26 123 456  AR  name 
4 39 123 456  AR  name 
5 40 123 456  AR name, inc. 
6 41 123 456  AR  name 
7 42 123 456  AR  name 
8 43 123 456  AR  name 
9 44 123 456  AR  name 
10 217 123 456  AR  name 
11 218 123 456  AR  name 
12 219 123 456  AR  name 
13 220 123 456  AR  name 
14 221 123 456  AR  name 
15 250 123 456  AR  name 
16 251 123 456  AR  name 

               Title   Email 
0           cargador [email protected] 
1        Executive assistant [email protected] 
2       Asistente Administrativo [email protected] 
3 Atención al cliente vía telefónica , vía online [email protected] 
4         Asesor de ventas [email protected] 
5    International company representative [email protected] 
6         Vendedor de campo [email protected] 
7     PUBLICIDAD, ATENCIÓN AL CLIENTE [email protected] 
8        Asistente de Marketing [email protected] 
9           SOLDADOR [email protected] 
10 Se requiere vendedores,, Loja , Quevedo, Guayas) [email protected] 
11    Ing. Civil recién graduado, Yaruquí [email protected] 
12        ayudantes enfermeria [email protected] 
13  Trip Leader for International Youth Exchange [email protected] 
14    COUNTRY MANAGER/DIRECTOR COMERCIAL [email protected] 
15       Ayudante de Pasteleria [email protected] 
16        Ejecutiva de Ventas [email protected] 
+0

ありがとうございます!会社の列もタイトルと混同しているケースをスクリプトがキャッチできる変更がありますか? この例はインデックス5です。次のようにしてください。 company:name inc。 タイトル:国際企業代表 ありがとう! – David

+1

@David、 '、 'はフィールドの区切り文字なので、コードで会社とタイトルを区別できるようにするには、いくつかのロジックを考え出す必要があります。私は先行スペースが前の列にあると仮定して会社を修正するためにちょっと追加しました。私が上で提案したヒューリスティックは、明らかに単純化されています。これは上のコメントのpshepsポイントです。データクリーニングは、ほとんど常に芸術的なものです。これを行う方法は、データの何が間違っているかに大きく依存します。 –

関連する問題