2016-08-01 4 views
1

У меня есть функция, которая возвращает панель и dataframe. Например,Как назначить dataframe панели из функции return

def fo(pn,df) 
    some update on pn,df 
    return pn, df 

Затем нужно вызвать функцию Ф.О. обновить PN4 и pN3, как показано ниже,

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

где PN4 является структурой Panel4 и PN3 является панель. Насколько я знаю, pn4.loc [0] должен быть панелью, а pn3.loc [0] должен быть файловым кадром. Но я получил сообщение об ошибке при запуске такого кода

NotImplementedError: cannot set using an indexer with a Panel yet!

Как я могу устранить эту ошибку? Заранее спасибо.

Для подробной информации, я отправлю свои коды ниже:

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 
+0

Для futher информации, мой реальный код в моем файле питона, как 'UCC.loc [с], SCC.loc [с] = обновление (x, UCC.loc [c], SCC.loc [c], A, U) ' – Wedoso

ответ

0

Для dataframes и серии, вы можете использовать loc и ilocat и iat также), чтобы получить и установить. Для этого требуется кодирование. Ошибка, которую вы видите

NotImplementedError: cannot set using an indexer with a Panel yet!

Означает, что кто-то не обходил вокруг, чтобы это произошло для панелей.

вы должны быть в состоянии сделать задание с

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

Да, 'pn4 [0], pn3 [0] = fo (pn, df)' работает. Но не могли бы вы сказать мне, почему «loc» приведет к сообщению об ошибке? – Wedoso

+0

@Wedoso Я изложил причину в сообщении. Он должен работать так, как вы ожидали. Тем не менее, участник панды еще не сел, чтобы собрать код, необходимый для этого. Следовательно, «NotImplementedError», поскольку мы этого не реализовали. И комментарий «не может установить с помощью индексатора с Panel еще!». Они означают, что это так, и когда-нибудь это будет возможно. – piRSquared

0

Тип возврата в fo является dataframe; однако в последней строке вашего кода вы назначаете pn4.loc[0] и pn3.loc[0] объектам dataframe. pn.4loc[0] и pn3.loc[0] могут быть серии Pandas, поэтому вы видели ошибку, потому что индексирование.

Сделайте команду возврата как return pn.loc[0], df.loc[0], и вы, вероятно, сможете решить проблему.

Ниже приводится часть исходного кода в Pandas 0.15.1 описании NonImplementError вы столкнулись:

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!") 

Как вы можете увидеть, если размер кадра и панели не соответствует он поднимет ошибку.

+0

Спасибо за ваш быстрый ответ, но если я верну pn.loc [0], df.loc [0], pn.loc [ 0] станет файловой рамкой, а df.loc [0] станет серисом, чего я не хочу. Я бы вернул целые pn и df, чтобы обновить панель в pn4 и dataframe в pn3. – Wedoso

+0

Так что вы просто хотите обновить pn4 и pn3, а не создавать новые объекты? –

+0

Нет, я не хочу генерировать новый объект. Единственное, что мне нужно сделать, это обновить pn4 и pn3. Я добавляю свои коды выше. Вы можете проверить их для деталей. – Wedoso