2

我有大约 300 个 .csv 文件,它们都具有相同数量的检测数据行和列。由于每个 .csv 文件代表一天并且结构相同,因此我认为最好将每个 .csv 文件放入 Pandas DataFrame 中,然后将它们放入 Panel 对象中以执行更快的计算。

我想为面板内的每个 DataFrame 添加额外的计算列,最好没有 for 循环。我正在尝试对面板使用 apply 函数,并根据附加了“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。我正在使用的 apply 函数对 Series 对象进行操作,在这种情况下,它将是一个传递的列。 我的问题是如何在 Panel 上使用 apply 函数来计算新列并将它们附加到每个 DataFrame 中?

提前致谢。

4

2 回答 2

0

nit:“dir”是一个内置函数。您不应该将其用作变量名。

尝试使用双转置:

p = pd.Panel(np.random.rand(4,10,17),
             items=pd.date_range('2013/11/10',periods=4),
             major_axis=range(10),
             minor_axis=map(lambda x: "col%d" % x, range(17)))

pT = p.transpose(2,1,0)
pT = pT.join(pT.apply(newCalculation, axis='major'), rsuffix='p')
p = pT.transpose(2,1,0)
于 2013-12-01T07:09:23.703 回答
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 添加到原始数据帧。然后,您将为所有需要添加计算列的简单数据创建一个数据框。

于 2013-09-22T17:22:23.067 回答