【问题标题】:Python If Int between two values giving incorrect resultPython If Int 在两个值之间给出不正确的结果
【发布时间】:2026-01-17 14:25:01
【问题描述】:

我有一个如下所示的 pandas 数据框,

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'],
                      'seconds' : [21,200,300,400,500,600,700,800]})

I am trying to create buckets based on minutes as below,

def create_bucket(seconds):
    #row['seconds'], buckets- 5,10,15,20,25,30,>30
    if [(seconds >= 0) & (seconds <= 300)]:
        result = "5"
    elif [(seconds >= 301) & (seconds <= 600)]:
        result = "10"
    elif [(seconds >= 601) & (seconds <= 900)]:
        result = "15"
    elif [(seconds >= 901) & (seconds <= 1200)]:
        result = "20"
    elif [(seconds >= 1201) & (seconds <= 1500)]:
        result = "25"
    elif [(seconds >= 1501) & (seconds <= 1800)]:
        result = "30"
    else:
        result = ">30"
    return result

df['Bucket'] = df.apply(lambda row: create_bucket(df['seconds']), axis=1)

我得到的结果是所有值都是 5。我试图找出函数 create_bucket 有什么问题。任何帮助将不胜感激。

A   seconds Bucket
0   foo 21  5
1   bar 200 5
2   foo 300 5
3   bar 400 5
4   foo 500 5
5   bar 600 5
6   foo 700 5
7   foo 800 5

【问题讨论】:

  • 提示:尝试运行if [False]: print("test")
  • 感谢约瑟夫。将第一个检查替换为 if [False] 或 if [True] 条件提供相同的结果 - 打印出测试。 dtype 是 int32 秒,因此似乎不是类型不匹配。无法弄清楚这一点。
  • 哎呀,你没看懂提示,所以我会发布一个答案来详细解释它。

标签: python-3.x pandas


【解决方案1】:

if 条件句周围不应该有方括号。当你把它们放在那里时,你最终得到的不是TrueFalse,而是列表:[True][False],它们的计算结果都是True,因为非空列表总是真实的。此外,&amp; 是按位与,但您需要逻辑与,因此请改用 and

【讨论】:

  • 再次感谢约瑟夫。我最初是这样做的,但出现以下错误,
  • 对不起。我收到的错误是,ValueError:('一个系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。', '发生在索引 0')我早些时候得到了这个错误,为了解决这个错误,如帖子 (*.com/questions/38834028/…) 中提到的,我添加了按位 & 和方括号,这导致了你指出的逻辑问题。试图找出最好的方法来实现这个逻辑。
最近更新 更多