2

インストルメンテーション データの行数と列数がすべて同じ .csv ファイルが 300 個まであります。各 .csv ファイルは 1 日を表し、構造は同じであるため、各 .csv を Pandas DataFrame にプルしてから、それらを Panel オブジェクトにスローして計算を高速化するのが最善であると考えました。

できれば for ループを使用せずに、パネル内にある各 DataFrame に追加の計算列を追加したいと思います。パネルに適用機能を使用し、元の列名に「p」を追加して新しい列に名前を付けようとしています (後で簡単にインデックスを作成するため)。以下は、私が現在使用しているコードです。

import pandas as pd
import numpy as np
import os.path

dir = "data/testsetup1/"
filelist = []

def initializeDataFrames():
    for f in os.listdir(dir):
        if ".csv" in f:
                filelist.append(dir + f)

    dd={}
    for f in filelist:
        dd[f[len(dir):(len(f)-4)]] = pd.read_csv(f)

    return pd.Panel(dd)

def newCalculation(pointSeries):
#test function, more complex functions to follow

    pointSeriesManiuplated = pointSeries.copy()

    percentageMove = 1.0/float(len(pointSeriesManiuplated)) 

    return pointSeriesManiuplated * percentageMove


myPanel = initializeDataFrames()
#calculatedPanel = myPanel.join(lambda x: myPanel[x,:,0:17].apply(lambda y:newCalculation(myPanel[x,:,0:17].ix[y])), rsuffix='p')
calculatedPanel = myPanel.ix[:,:,0:17].join(myPanel.ix[:,:,0:17].apply(lambda x: newCalculation(x), axis=2), rsuffix='p')

print calculatedPanel.values

上記のコードは現在、計算された列を各 DataFrame に追加するのではなく、各 DataFrame を複製しています。私が使用している適用関数は、この場合は渡された列になる Series オブジェクトで動作します。 私の質問は、新しい列を計算して各 DataFrame に追加するように、Panel で apply 関数を使用するにはどうすればよいですか?

前もって感謝します。

4

2 に答える 2

0

apply適用操作の出力を目的の列に割り当てるだけで新しい列を追加する場合は、次のようにします。

myPanel['new_column_suffix_p'] = myPanel.apply(newCalculation)

複数の列が必要な場合は、このためのカスタム関数を作成できます。

def calc_new_columns (rowset):
    rowset['newcolumn1'] = calculation1(rowset.columnofinterest)
    rowset['newcolumn2'] = calculation2(rowset.columnofinterest2 + rowset.column3)
    return rowset
myPanel = myPanel.apply(calc_new_columns)

より広い意味で。新しい列操作を一度に実行できるように見える場合、データ フレームのセクションを手動で処理しています。最初の csv ファイルをデータ フレームにインポートすることをお勧めします。次に、残りの 299 個の csv をループし、DataFrame.append を使用して元のデータ フレームに追加します。次に、単純に計算列を追加する必要があるすべてのデータに対して 1 つのデータ フレームを作成します。

于 2013-09-22T17:22:23.067 に答える