Проблемы с распаковкой кортежей - PullRequest
0 голосов
/ 05 апреля 2020

В функции я возвращаю список из двух значений, если значения есть, или пустой список, как показано ниже:

def func1(prikey):
    try:
      df = somesql
      for index, rW in df.iterrows():
          retvalue = [rW['id_in_int'],rW['time_in_str']]
    except:
        retvalue = []
    return retvalue

В основном коде я назначаю переменную :

newdf['newid'],newdf['thistime'] = func1(newdf['prikey'])

Но я получил ошибку "недостаточно значений для распаковки (ожидается 2, получено 0)" Итак, в функции я попытался, как показано ниже

retvalue = [[],[]]

Но получил ошибка как «Длина значений не соответствует длине индекса». И retvalue = [0,0] не дал никакой ошибки, а значение newdf['newid'],newdf['thistime'] равно нулю.

И, когда я пытаюсь проверить, является ли значение равно нулю в следующих строках как if(newdf['newid']==0):, что дает ошибку: истинное значение Серии неоднозначно. Используйте a.empty, a.bool (), a.item (), a.any () или a.all ()

Я также попытался проверить len(), что тоже не сработало. Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 05 апреля 2020

Ваш код ниже возвращает 1 список,

def func1(prikey):
    try:
      df = somesql
      for index, rW in df.iterrows():
          retvalue = [rW['id_in_int'],rW['time_in_str']]  #here 1 list!
    except:
        retvalue = [] #here 1 list!
    return retvalue

Это приведет к ошибке: "недостаточно значений для распаковки (ожидается 2, получено 0)" в вашем следующем операторе:

newdf['newid'],newdf['thistime'] = func1(newdf['prikey'])

Поскольку пример кода для другой описанной вами ошибки отсутствует:

Для операторов 'or' и 'и' python требуются значения истинности. Если они считаются неоднозначными, вы должны использовать «побитовый» | (или) или & (и) операции. Отметьте это

0 голосов
/ 07 апреля 2020

Спасибо, Шейл sh и Сами за ваши ответы. Внутри функции я использовал retvalue = [0,0] для разрешения ошибки «недостаточно значений для распаковки (ожидалось 2, получено 0)».

Статья https://towardsdatascience.com/apply-and-lambda-usage-in-pandas-b13a1ea037f7 помогла мне использовать ». применить "на серии и ниже код.

newdf['newwaittime'] = newdf['newid'].apply(lambda x: 0 if x==0 else get_new_wait_time(x))

, где я проверяю, является ли значение newdf['newid'] нулевым или нет.

0 голосов
/ 05 апреля 2020

Я думаю, вы не можете присвоить 0 столбцу. попробуйте присвоить "" (пустая строка) или np.NaN. Также newdf['newid'] имеет тип Series, и вы не можете сравнить его с bool, поэтому вы можете использовать newdf['newid'].empty или len(newdf['newid']) == 0

...