2017-10-09 4 views
-2

における2-Dアレイに.datファイル格納を解析しよう:
データ例(.DATA):私は同様のフォーマットファイル解析する例有するパンダ

+ Naoki Abe 
- Myriam Abramson 
+ David W. Aha 
+ Kamal M. Ali 
- Eric Allender 

そしてここであり店舗2D配列にコード用のPython例:私の理解から

df = pd.read_csv(
    filepath_or_buffer='path/to/.data/file', 
    header=None, 
    sep=',') 

# separate names from classes 
vals = df.loc[:,:].values 
names = [n[0][2:] for n in vals] 
cls = [n[0][0] for n in vals] 

、このPythonコードは、データがdf変数とvals変数に各人物に関連付けられた文字列データを抽出することを意味します。そして、valsの文字列をnamesclsに分割します。 namesとのリストは、i番目の人の名前がnames[i]であり、関連クラスがcls[i]になるようにそれらのコンポーネントを保持する必要があります。私はエラーを得た

# read in the dataset 
df = pd.read_csv(
    engine='python', 
    filepath_or_buffer='data/Pro1/train.dat', 
    header=None, 
    sep='\t+') 

# separate names from classes 
vals = df.loc[:,:].values 
comm = [n[0][2:] for n in vals] 
rates = [n[:1][0] for n in vals] 

:私は別の類似のデータセット(.DAT)を解析するために、同様の方法を使用する場合のように

はしかし、

-1 this is comment1 blah blah blah (it is a big paragraph) 
-1 this is comment2 blah blah blah (it is a big paragraph) 
-1 this is comment3 blah blah blah (it is a big paragraph) 

はしたがって、私はあることを例を修正しましたメッセージ:TypeError: 'long' object has no attribute '__getitem__' at comm = [n[0][2:] for n in vals]
エラーメッセージを検索したところ、intを文字列(?)に格納しようとしていたことを説明しました。私はコメントの全体の段落を格納しようとしており、文字列です。そして、この例では、名前の文字列を保存しました。私は.datファイルを解析しなければならなかったので、 私が持っているもう一つの問題があり、私はそれではなく、宇宙の-1背後TABで推測しています、私は私が設定され、配列の範囲が正しいかどうかを確認していない**

私の経験。:私はPythonの専門家ではないと思っています。私は間違いなくコードを読むことができますが、それを書いている途中で研究をしなければなりません。このようなデータ分析を行うためにPythonが私の唯一の選択肢です。

答えて

0

最初のファイルにはコンマ区切り記号がありません。したがって、ファイル内の各行は「+ Naoki Abe」のように単一の文字列になります。その結果、文字列スライシングを使用して残りの文字列から名前を分離することができます。

>>> import pandas as pd 
>>> df = pd.read_csv('temp.csv', header=None, sep=',') 
>>> vals = df.loc[:,:].values 
>>> vals 
array([['+ Naoki Abe'], 
     ['- Myriam Abramson'], 
     ['+ David W. Aha'], 
     ['+ Kamal M. Ali'], 
     ['- Eric Allender']], dtype=object) 
>>> names = [n[0][2:] for n in vals] 
>>> names 
['Naoki Abe', 'Myriam Abramson', 'David W. Aha', 'Kamal M. Ali', 'Eric Allender'] 
>>> cls = [n[0][0] for n in vals] 
>>> cls 
['+', '-', '+', '+', '-'] 

私はあまりにも、各行の残りの部分から-1を分けるタブ文字があると思っていました。その結果、パンダは各行をタブで分割します。この場合、タブをセパレータとして宣言した後は、文字列スライスを使用することはできません。

>>> df2 = pd.read_csv('temp2.csv', engine='python', header=None, sep='\t') 
>>> vals2 = df2.loc[:,:].values 
>>> vals2 
array([[-1, 'this is comment1 blah blah blah (it is a big paragraph)'], 
     [-1, 'this is comment2 blah blah blah (it is a big paragraph)'], 
     [-1, 'this is comment3 blah blah blah (it is a big paragraph)']], dtype=object) 
>>> first = [val[0] for val in vals2] 
>>> first 
[-1, -1, -1] 
>>> second = [val[1] for val in vals2] 
>>> second 
['this is comment1 blah blah blah (it is a big paragraph)', 'this is comment2 blah blah blah (it is a big paragraph)', 'this is comment3 blah blah blah (it is a big paragraph)'] 

しかし、絶望しないでください!

両方のデータファイルを同様の方法で処理できる方法があります。

sep='\s+'を使用すると、タブとスペースが同様に処理されます。次に、パンダは各行を文字列のリストに変換します。今すぐ行う必要があるのは、最初のアイテムを選んで、他のアイテムを再構成することだけです。

>>> df3 = pd.read_csv('temp2.csv', engine='python', header=None, sep='\s+') 
>>> vals3 = df3.loc[:,:].values 
>>> vals3 
array([[-1, 'this', 'is', 'comment1', 'blah', 'blah', 'blah', '(it', 'is', 
     'a', 'big', 'paragraph)'], 
     [-1, 'this', 'is', 'comment2', 'blah', 'blah', 'blah', '(it', 'is', 
     'a', 'big', 'paragraph)'], 
     [-1, 'this', 'is', 'comment3', 'blah', 'blah', 'blah', '(it', 'is', 
     'a', 'big', 'paragraph)']], dtype=object) 
>>> first = [val[0] for val in vals3] 
>>> first 
[-1, -1, -1] 
>>> second = [' '.join(val[1:]) for val in vals3] 
>>> second 
['this is comment1 blah blah blah (it is a big paragraph)', 'this is comment2 blah blah blah (it is a big paragraph)', 'this is comment3 blah blah blah (it is a big paragraph)'] 

私の最終的な発言:私はあなたのcsvモジュール上でのパンダの使用について質問します。

関連する問題