2016-04-19 20 views
1

私はcsvファイルを読み込んでデータフレームとして保存し、時間ごとにそれを再サンプリングする関数を書いています。以下は私のコードです。csvファイルの内容をデータフレームに保存する[Python Pandas]

def ABC(path1,path2): 
    df1=pd.read_csv(path1, sep='\t',names = ["Datetime", "Value"]) 
    df2=pd.read_csv(path2, sep='\t',names = ["Datetime", "Value"]) 
    df1['Datetime']=pd.to_datetime(df1['Datetime']) 
    df1=df1.set_index('Datetime') 
    df1=df1.resample('H',how='sum') 
    df2['Datetime']=pd.to_datetime(df2['Datetime']) 
    df2=df2.set_index('Datetime') 
    df2=df2.resample('H',how='sum') 
    ABC = pd.DataFrame(df1['Value'] + df2['Value']) 
    ABCD = ABC * 0.519 
    return ABC, ABCD 
ABC, ABCD= ABC('C:\Users\Desktop\B1.tsv' 
          ,'C:\Users\Desktop\B2.tsv') 

このプログラムはうまくいきますが、30個のファイルパスがある場合、30個のデータフレームを作成してこのプロセスを実行するのは難しいでしょう。 私は上記のやり方に従うことを考えていました。

def ABC(): 
    Path= ['B1','B2','B3'] 
    general = [] 
    for i in Path: 
     url = ('C:\Users\Desktop\%s.tsv'%i) 
     X = pd.read_csv(url,sep='\t',names = ["Datetime", "Value"]) 
     X['Datetime']=pd.to_datetime(X['Datetime']) 
     X=X.set_index('Datetime') 
     X=X.resample('H',how='sum') 
     general.append(X) 
     return general 
df=ABC() 
print df 

上記のコードは、1つのdataFrameを出力し、最初のスクリプトが何をしているのか出力しないだけです。私が間違って何をしているのか?

+0

だから 'df1、df2、df3 = ABC()'は3つのデータフレームを返しませんか? – IanS

+0

いいえ、「解凍するには1つ以上の値が必要です」と表示されます。また、 'df = ABC()'の代わりに 'ABC()'を書くだけで、1つのデータフレームが得られます。 – Muhammad

答えて

1

あなたは早すぎます(最初の反復後に)。インデントの問題です。関数は、次のようになります。

def ABC(): 
    Path= ['B1','B2','B3'] 
    general = pd.DataFrame() 
    for i in Path: 
     url = ('C:\Users\Desktop\%s.tsv'%i) 
     X = pd.read_csv(url,sep='\t',names = ["Datetime", "Value"]) 
     X['Datetime']=pd.to_datetime(X['Datetime']) 
     X=X.set_index('Datetime') 
     X=X.resample('H',how='sum') 
     if len(general) == 0: 
      general = X 
     else: 
      general = general['Values'] + X['Values'] 
    return general 

最後の行のインデントに注意してください。


EDIT:コメントで要求されるようにループ内のデータフレームの合計に加えコード。

最初に、generalという空のデータフレームを作成します。最初の繰り返し(空のデータフレームの長さが0の場合)で、現在のデータフレームXgeneralに割り当てます。その後の反復では、現在のデータフレームの値を、前のすべてのデータフレームの値の合計に加算します(generalに格納)。

+0

Ops、Thanks @IanS。また、これらのデータフレームを関数に追加する必要がある場合はどうすればよいでしょうか?たとえば、ABC = pd.DataFrame(df1 ['Value'] + df2 ['Value']) '。 forループ内でこれを行う方法はありますか?戻り値は3つではなく1つのデータフレームにする必要がありますか? – Muhammad

+0

ありがとう、これらの新しい(最後のいくつかの)行が何をしているのか説明していただけますか? – Muhammad

関連する問題