【问题标题】:pandas: boolean selecting rows by index (DatetimeIndex)pandas:按索引选择行的布尔值(DatetimeIndex)
【发布时间】:2020-11-23 19:46:18
【问题描述】:

我创建了一个 DataFrame 来保存能量记录器数据。现在这个 DataFrame 只存储一些随机数。作为索引,我使用pandas.core.indexes.datetimes.DatetimeIndex。使用weekday 属性,我可以计算出相应的工作日(0 代表星期一,1 代表星期二……)。

我预计周末不会有任何能源消耗。我的对应代码大概是:

# weekday > 4 => saturday and sunday
df.loc[df.index.weekday > 4, 'power'] = 0

这很好用。但是比方说,周三和周四没有消费。我希望相应的代码如下所示:

df.loc[(df.index.weekday == 2 or df.index.weekday == 3), 'power'] = 0

这不起作用。我收到以下错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

好的,pandas 提示我这些方法 anyall。但据我了解,它们并没有满足我的需求——或者至少我不知道如何使用它们来满足我的需求。

问题:

有谁知道,如何获得这样一个由某个布尔条件确定的 DataFrame 切片?

非常感谢!

附注:

我已经想出了一个解决方案 - 但它很不舒服:

df.loc[df.index.weekday == 2, 'power'] = 0
df.loc[df.index.weekday == 3, 'power'] = 0

想象一下,我想花几个小时或几分钟而不是几天来做同样的事情。必须有一种更简单的方法来做到这一点。

【问题讨论】:

    标签: python-3.x pandas dataframe indexing


    【解决方案1】:

    这些情况下的条件组合必须用& (AND) 或| (OR) 连接,并且单个条件必须放在括号中。

    df.loc[(df.index.weekday == 2) | (df.index.weekday == 3), 'power'] = 0

    应该工作

    根据评论编辑: 这可以通过使用isin(list) 方法延长到更多天: df.loc[(df.index.weekday.isin([3,4,5])), 'power'] = 0

    【讨论】:

    • 但是如果我想多做几天的话,还是要打很多字。还有其他更优雅的解决方案吗?
    • 很高兴听到这个消息。请随意投票并接受我的回答。是的,您可以使用df.index.weekday.isin([list of days]) 作为您的条件来扩展它
    • 完美! :) 谢谢!
    猜你喜欢
    • 2019-12-07
    • 2019-06-18
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2015-05-30
    • 2021-10-10
    • 1970-01-01
    • 2016-12-05
    相关资源
    最近更新 更多