2017-11-16 13 views
3

私は単純なプログラムを作るためにpandasライブラリを使用しています。Dataframeとread_csv関数 - Python

まず、以下の構造を含むsmall.csvという.csvファイルがあります。私は、次のコードを持っている私の主な機能には

1,4.0,?,?,none,? 
2,2.0,3.0,?,none,38 
2,2.5,2.5,?,tc,39 

def main(): 
    # my code here 
    fname = "/home/sergio/PycharmProjects/practica2/small.csv" 
    sep = "," 
    vars = ["x1", "x2", "x3", "x4", "x5", "x6"] 
    na_values = ["?", "none"] 
    prefix = "col_" 

    df = da.load_data(fname, delimiter=sep, nan=na_values, 
         header=False, pref=prefix) 
    print df 

主な機能の説明は、次は私がLOAD_DATA関数に渡すパラメータに応じ、ある、あなたがする必要があります私の.csvファイルからデータを読み込みます。

  • で、inputFile:データを含むCSVファイルの名前

    これらは、可能な引数と、彼らが開発する機能です。

  • 区切り記号:データを区切る文字。デフォルトでは、関数はカンマ文字( "、")を使用する必要があります。
  • nan:欠損値として扱われる文字列のリスト。このリスト内の文字列のうちの1つの入力ファイル内のオカレンスはすべてNaNとして解釈されます。デフォルト値はNoneです。
  • header:ファイルにヘッダーが含まれているか(True)、そうでないか(False)を示すブールフラグ。デフォルトではTrueでなければなりません。
  • varNames:ヘッダが有効である場合にのみ変数名として使用される* Strings *のリストFalse。デフォルト値はNoneです。
  • pref:ヘッダが有効でFalseで、リストが定義されていない場合にのみ、変数名の接頭辞として使用される文字列* varNames。たとえば、pref = "x"の場合、変数の名前は "x0"、 "x1"、 "x2"などになります。デフォルト値は "var_"になります。

マイLOAD_DATA機能:

def load_data(inputFile, delimiter=",", nan=None, header=True, 
       varNames=None, pref="var_"): 

    data = DataFrame() 

    if header == False: 
     if not varNames: 
      print "header=false and varNames not defined" 
      data = pd.read_csv(inputFile, sep=delimiter, na_values=nan, prefix=pref, header=None) 
      listaNum = list(range(len(data.columns))) 
      data.columns = listaNum 
     else: # varNames defined 
      data = pd.read_csv(inputFile, sep=delimiter, na_values=nan, prefix=pref) 
    else: 
     return data 

この機能は、ケース

I例の一つに応じて出力を変化させ、我々が入力したパラメータに基づいてデータを表示するための責任があります評価する必要があります次のとおりです。

header = Falseであり、列の名前がその関数に渡されていないことを示す変数varsNames(Null)の場合、0から数値の値を割り当てる必要があります。 0 1 2 ...最大カラムまで。

また、この場合、私は渡された接頭辞を列を定義する番号に追加する必要があります。この場合、「col_」になります。

結果は、次のいずれかになりwoulb:ここ

col_0 col_1 col_2 col_3 col_4 col_5 
0 1 4.0  NaN NaN  NaN NaN 
1 2 2.0  3.0 NaN  NaN 38.0 
2 2 2.5  2.5 NaN  tc 39.0 

は、私は、我々は変数の接頭辞で、数値列のそれぞれにプレフィックスを追加することが必要であることコメントしている場合には、私の問題です手でそれを行うことができます。つまり、私の列リストの各要素に、文字列 "col_"を追加します。

しかし、私はread_csv関数で渡すことができる "接頭辞"オプションを使用しないので間違っていると思いますが、私はそれを試しても正しく実行しません。

これは私の結果で、read_csv関数に接頭引数を渡してもわかりますが、無視します。

0 1 2 3 4  5 
0 1 4.0 NaN NaN NaN NaN 
1 2 2.0 3.0 NaN NaN 38.0 
2 2 2.5 2.5 NaN tc 39.0 

また疑問の別の一つは、私は列に割り当てる必要があり、数値を計算しておりますので、私は既に生成されたデータフレームを修正すること、それを行うことであり、私はそれがあると信じていますそれを実現する最も最適な形ではありません。

+0

これは、テキストの山芋たくさんあるので、私はもう一度頼みますよ。あなたの問題は何ですか?どこが間違っていますか? –

+0

load_functionを見て、番号の列の例に接頭辞を追加する必要がありますが、関数が正しく機能しません。この場合、主関数では "col_"を渡しますが、これは表示する列の名前には追加されません。 0 1 2 ...の代わりにcol1 col2 col3 ... – fiticida

+0

私はあなたの問題を再現することはできませんが、あなたは私の答えが表示されたら、回避策を提供することができます。 –

答えて

2

v0.21でこれがうまく動作します。

import io 

text = \ 
'''1,4.0,?,?,none,? 
2,2.0,3.0,?,none,38 
2,2.5,2.5,?,tc,39''' 

buf = io.StringIO(text) 

df = pd.read_csv(buf, na_values=['?', 'none'], header=None, prefix='col_') 
df 

col_0 col_1 col_2 col_3 col_4 col_5 
0  1 4.0 NaN NaN NaN NaN 
1  2 2.0 3.0 NaN NaN 38.0 
2  2 2.5 2.5 NaN tc 39.0 

別のトリック(まだこのが動作しない場合は)add_prefixを使用することです:

df 

    0 1 2 3 4  5 
0 1 4.0 NaN NaN NaN NaN 
1 2 2.0 3.0 NaN NaN 38.0 
2 2 2.5 2.5 NaN tc 39.0 

df = df.add_prefix('col_')  
df 

    col_0 col_1 col_2 col_3 col_4 col_5 
0  1 4.0 NaN NaN NaN NaN 
1  2 2.0 3.0 NaN NaN 38.0 
2  2 2.5 2.5 NaN tc 39.0 
+0

ありがとう、私は、それは、なしか偽の使用に関する問題だと思う。 ggrrrg – fiticida

関連する問題