Python 如何从函数返回将dataframe分配给面板

Python 如何从函数返回将dataframe分配给面板,python,pandas,dataframe,panel,Python,Pandas,Dataframe,Panel,我有一个返回面板和数据帧的函数。比如说, def fo(pn,df) some update on pn,df return pn, df 然后我需要调用fo函数来更新pn4和pn3,如下所示 pn4.loc[0], pn3.loc[0] = fo(pn,df) 其中pn4为面板4结构,pn3为面板。据我所知,pn4.loc[0]应该是一个面板,pn3.loc[0]应该是一个数据帧。但是当我运行这样的代码时,我收到了一条错误消息 NotImplementedError:无法使用带有面

我有一个返回面板和数据帧的函数。比如说,

def fo(pn,df)
  some update on pn,df
  return pn, df
然后我需要调用fo函数来更新pn4和pn3,如下所示

pn4.loc[0], pn3.loc[0] = fo(pn,df)
其中pn4为面板4结构,pn3为面板。据我所知,pn4.loc[0]应该是一个面板,pn3.loc[0]应该是一个数据帧。但是当我运行这样的代码时,我收到了一条错误消息

NotImplementedError:无法使用带有面板的索引器进行设置

那么我如何解决这个错误呢?提前谢谢

为了进一步了解,我在下面发布了我的代码:

def update(x, UC, SC, A, U): # accelerated version, examined on 07/15 

    for a in A:
        UC_old = UC.copy()
        for u in U:
            UC.loc[a,:,u] = UC_old.loc[a,:,u] - UC_old.loc[a,:,x] * UC_old.loc[a,x,u]
        SC_old = SC.copy()
        SC.loc[:,a] = SC_old.loc[:,a] + UC_old.loc[a,x,:] * (1 - SC_old.loc[x,a])

    return UC, SC


def Streaming(UC, Au, k, U, A):
    ep = 0.01
    SC = pd.DataFrame(0.0, index = U, columns = A)
    max_mg = 0    
    for x in U:
        mg = computeMG(x, UC, SC, Au, A, U)
        max_mg = mg if mg > max_mg else max_mg
    del SC
    C = []
    S = {}
    m = max_mg
    while (m <= k*max_mg):
        C.append(m)
        S[m] = []        
        m = m * (1+ep)
    print len(C)
    UCC = pd.Panel4D(dict([(c, UC.copy()) for c in C]))           
    SCC = pd.Panel(0., items = C, major_axis = U, minor_axis = A)
    for x in U:
        for c in C:
            if (computeMG(x, UCC.loc[c], SCC.loc[c], Au, A, U) > c/float(2*k)) and (len(S[c])<k):
                S[c].append(x)
                UCC.loc[c], SCC.loc[c] = update(x, UCC.loc[c], SCC.loc[c], A, U) # where the error happens
    max_val = 0
    for c in C:
        val = 0
        for u in U:
            Tsu = 0
            for a in A:
                Tsu += SCC.loc[c,u,a]
            Tsu = Tsu / float(Au.loc[u])
            val += Tsu
        if val > max_val:
            S = S[c]
            max_val = val
    return S, max_val
def更新(x、UC、SC、A、U):#加速版,于2015年7月检查
对于a中的a:
UC_old=UC.copy()
对于u中的u:
UC.loc[a,:,u]=UC_old.loc[a,:,u]-UC_old.loc[a,:,x]*UC_old.loc[a,x,u]
SC_old=SC.copy()
SC.loc[:,a]=SC_old.loc[:,a]+UC_old.loc[a,x,:]*(1-SC_old.loc[x,a])
返回UC,SC
def流(UC、Au、k、U、A):
ep=0.01
SC=pd.DataFrame(0.0,索引=U,列=A)
最大值mg=0
对于U中的x:
mg=计算(x,UC,SC,Au,A,U)
如果mg>max\u mg,则max\u mg=mg,否则max\u mg
德尔SC
C=[]
S={}
m=最大值(mg)
而(mc/float(2*k))和(len(S[c])max_val:
S=S[c]
max_val=val
返回S,最大值

fo中的返回类型是dataframe;但是在代码的最后一行中,您将
pn4.loc[0]
pn3.loc[0]
分配给dataframe对象。
pn.4loc[0]
pn3.loc[0]
可以是一系列,这就是为什么您会看到错误,因为索引是无效的

将return命令设置为
return pn.loc[0],df.loc[0]
,您可能可以解决这个问题

下面是描述您遇到的错误的源代码部分:

def _align_panel(self, indexer, df):
        is_frame = self.obj.ndim == 2
        is_panel = self.obj.ndim >= 3
        raise NotImplementedError("cannot set using an indexer with a Panel 
                                  yet!")

正如您可以看到的,如果框架和面板的尺寸不匹配,它将引发错误。

fo中的返回类型是dataframe;但是在代码的最后一行,您将
pn4.loc[0]
pn3.loc[0]
分配给dataframe对象。
pn.4loc[0]
pn3.loc[0]
可以是Pandas系列,这就是为什么您会看到错误,因为索引是无效的

将return命令设置为
return pn.loc[0],df.loc[0]
,您可能可以解决这个问题

下面是描述您遇到的错误的源代码部分:

def _align_panel(self, indexer, df):
        is_frame = self.obj.ndim == 2
        is_panel = self.obj.ndim >= 3
        raise NotImplementedError("cannot set using an indexer with a Panel 
                                  yet!")

正如您可以看到的,如果框架和面板的尺寸不匹配,它将引发错误。

对于数据框架和系列,您可以使用
loc
iloc
(和
at
iat
)来获取和设置。这需要进行编码。您看到的错误

NotImplementedError:无法使用带有面板的索引器进行设置

这意味着还没有人能在面板上实现这一点

你应该能够用英语完成作业

pn4[0], pn3[0] = fo(pn,df)

对于数据帧和序列,您可以使用
loc
iloc
(以及
at
iat
来获取和设置。这需要进行编码。您看到的错误

NotImplementedError:无法使用带有面板的索引器进行设置

这意味着还没有人能在面板上实现这一点

你应该能够用英语完成作业

pn4[0], pn3[0] = fo(pn,df)

感谢您的快速回复,但如果我返回pn.loc[0],df.loc[0],pn.loc[0]将成为数据帧,df.loc[0]将成为一个序列号,这不是我想要的。我想返回整个pn和df以更新pn4中的面板,事实上返回pn3中的数据帧。所以你只想更新pn4和pn3,而不生成新对象吗?不,我不想生成任何新对象。我只需要更新pn4和pn3。我在上面添加了我的代码。你可以检查它们以了解更多信息r详细信息。感谢您的快速回复,但如果我返回pn.loc[0],df.loc[0],pn.loc[0]将成为数据帧,df.loc[0]将成为一个序列号,这不是我想要的。我想返回整个pn和df以更新pn4中的面板,事实上返回pn3中的数据帧。所以你只想更新pn4和pn3,而不生成新对象吗?不,我不想生成任何新对象。我只需要更新pn4和pn3。我在上面添加了我的代码。你可以检查它们以了解更多信息r详细信息。对于进一步的信息,我python文件中的真实代码类似于更新(x,UCC.loc[c],SCC.loc[c],A,U)对于进一步的信息,我python文件中的真实代码类似于
UCC.loc[c],SCC.loc[c]=update(x,UCC.loc[c],SCC.loc[c],A,U)
是的,
pn4[0],pn3[0]=fo(pn,df)
有效。但是你能告诉我为什么
loc
会导致错误消息吗?@Wedoso我在帖子中说明了原因。它的作用与你预期的一样。但是,熊猫的贡献者还没有坐下来整理实现这一点所需的代码。因此出现了“NotImplementedError”,因为我们还没有实现它。还有一句话,“还不能使用带面板的索引器进行设置!”。他们的意思是这样的,有一天它可能会这样。是的,
pn4[0],pn3[0]=fo(pn,df)
有效。但是你能告诉我为什么
loc
会导致错误消息吗?@Wedoso我在帖子中说明了原因。它的作用与你预期的一样。但是,熊猫的贡献者还没有坐下来整理实现这一点所需的代码。因此出现了“NotImplementedError”,因为我们还没有实现这一点。还有一句话,“还不能使用带面板的索引器进行设置!”。他们的意思是这样做,将来可能会这样。