【问题标题】:Too many values to unpack using apply()使用 apply() 解包的值太多
【发布时间】:2020-06-03 22:53:45
【问题描述】:

这是我的代码:

def f(row):
  if row['CountInBedDate'] == 1 and row['CountOutBedDate'] == 1:
    SleepDate = row['DateInBed']
    InBedTimeFinal = row['InBedTime']
    OutBedTimeFinal = row['OutBedTime']
  else:
    SleepDate = -1
    InBedTimeFinal = -1
    OutBedTimeFinal = -1
  return SleepDate, InBedTimeFinal, OutBedTimeFinal

s1['SleepDate'], s1['InBedTimeFinal'], s1['OutBedTimeFinal'] = s1.apply(f, axis=1)

我想用 apply() 创建 3 个新列,但是有

ValueError: too many values to unpack (expected 3)

如果我使用它,只会创建一列,并结合 3 个值:

s1['SleepDate', 'InBedTimeFinal', 'OutBedTimeFinal'] = s1.apply(f, axis=1)

你能帮忙吗?谢谢。

【问题讨论】:

标签: python pandas


【解决方案1】:

如果f是你真正的函数,那么你应该考虑使用where而不是apply,它会更快。

s1[['SleepDate', 'InBedTimeFinal', 'OutBedTimeFinal']] = \
           s1[['DateInBed','InBedTime','OutBedTime']].where(s1['CountInBedDate'].eq(1), other=-1)

请注意,您似乎在函数中检查了两次 CountInBedDate 是否等于 1

如果你想使用apply,那么你可以试试:

s1[['SleepDate', 'InBedTimeFinal', 'OutBedTimeFinal']] = \
               pd.DataFrame(s1.apply(f, axis=1).tolist(), s1.index)

【讨论】:

  • 谢谢。我的错。我已将其更改为 CountOutBedDate。我想使用 if else 因为我会在代码中添加其他条件。这只是其中的一小部分。
【解决方案2】:

您的函数f 为每一行返回元组,因此apply 将元组堆叠成系列。您需要 f 返回系列并在 apply 的结果的 ndarray 上解包

def f(row):
  if row['CountInBedDate'] == 1 and row['CountOutBedDate'] == 1:
    SleepDate = row['DateInBed']
    InBedTimeFinal = row['InBedTime']
    OutBedTimeFinal = row['OutBedTime']
  else:
    SleepDate = -1
    InBedTimeFinal = -1
    OutBedTimeFinal = -1
  return pd.Series([SleepDate, InBedTimeFinal, OutBedTimeFinal]) #change here

s1['SleepDate'], s1['InBedTimeFinal'], s1['OutBedTimeFinal'] = s1.apply(f, axis=1).T.values

【讨论】:

  • 是的另一个选项:)
  • @Ben.T: 谢谢 :) +1
猜你喜欢
  • 2023-02-03
  • 2016-05-24
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 2016-05-11
相关资源
最近更新 更多