2017-02-27 4 views
2

私はどこに問題があるのか​​分かりませんが、このコードは非常に簡単な例ではうまくいきましたが、実際のデータで作業を開始したときに問題が発生しました。私のパンダのデータフレームが「なし」タイプになっているのはなぜですか?

私は基本的に、様々なCSVファイルから特定のデータを抽出し、最終的には、単一のデータフレームにそれらを結合しようとしています。ただ

wavenames = ['W1_', 'W2_', 'W3_'] 
logs=['log1','log2','log3','log4'] 

for w in wavenames: 
    AllSynt = pd.DataFrame(index=range(6341), columns=['X']+logs) 
    AllSynt['X']=z # an array extracted from elsewhere 
    print AllSynt.head(3) 
    for f in files: 
     for l in logs: 
      if (f.startswith('Synthetic_'+w)) & (f.endswith(l+'.csv')): 
       df = pd.read_csv(path+f,delimiter=',') 
       AllSynt = pd.DataFrame(AllSynt) 
       AllSynt = AllSynt.merge(df,how='left',on='X') 
       AllSynt = AllSynt.rename(columns = {'Y':l}, inplace = True) 
    print '\n', AllSynt.head(5) 

が、これは私にAttributeError: 'NoneType' object has no attribute 'head' を与える(AllSyntは、ループの先頭にパンダのデータフレームであることを確認する前に、私は同じエラーを得た(:

コードの関連部分は以下の通りです。なぜAllSyntのデータフレームが永久Noneになりつつある、それは何の属性)は「合併しない」があると言って

+2

'rename'操作中に' inplace = True'を指定した場合、結果を変数に再割り当てする必要はありません。そのため、これらは 'None'値として返されます。 –

+0

ありがとう、これは少し助けました(すべての値は 'NaN'ですが、少なくともデータフレームです)。しかし、私はまだ疑いがあります - 質問で言及されているように、名前の変更プロセスの前に、ループの始めに "None"という値がすでに現れました。それはなぜですか? – durbachit

+1

これは、既に '' X''に対応する値だけをあらかじめ定義された配列で埋めている間に、あなたがすでに列名を設定していたからです。 'logs'(*は列名*を構成しました)にある要素はその下に値を持たなかったので、自然に' NaN 'で埋められました。 –

答えて

1

あなたが行を書き換える必要があるでしょう?

AllSynt = AllSynt.rename(columns={'Y':l}, inplace=True)

は、単純に次のようにする:

AllSynt.rename(columns={'Y':l}, inplace=True) # No assigning with inplace parameter 
# (or) 
AllSynt = AllSynt.rename(columns={'Y':l}  # assign without inplace parameter 

あなたがinplace=Trueを指定し、それが内容です見たいと思ったとき、彼らは単に代わりの新しいコピーを作成するDFを変異させると、それはNoneを返します。基本的に、あなたは結果にNoneを代入しているし、それはそれは.head()方法ですアクセスするためにもうpd.DataFrameオブジェクトではないとして、したがって、それはAttributeErrorを訴えます。

同様のアナロジーは、それらがデフォルトでinplaceを動作させるとも同じ理由でNoneを返すのと同じラインでの変数にその結果を割り当てながら、純粋なPythonでlist.append()list.sort()などの操作を行うことによって観察することができました。

関連する問題