【问题标题】:Python: Lambda function with multiple conditions based on multiple previous rowsPython:基于多个先前行的具有多个条件的 Lambda 函数
【发布时间】:2021-09-23 05:11:03
【问题描述】:

我正在尝试定义一个 lambda 函数,该函数根据各种条件将 TrueFalse 分配给一行。 有一列带有时间戳,我想要的是,如果 在过去 10 秒内(基于当前行 x 的时间戳)出现一些特定值数据集的其他列,当前行 x 获取 TrueFalse 标签。

所以基本上我必须检查是否在前面的 n 行中,即Timestamp(x) - 10 秒a 出现在列 A b 出现在B 列。

我已经用 freq = 10 seconds 查看了 shift() 函数,另一次尝试看起来像这样:

data['Timestamp'][(data['Timestamp']-pd.Timedelta(seconds=10)):data['Timestamp']]

但我无法继续使用这两个选项中的任何一个。

是否可以在 lambda 函数中启动额外的选择?如果是,那会是什么样子?

P.S.:由于应用程序/代码的整体设置,不能使用常规 for 循环 代替 lambda 函数。

感谢您的帮助和意见!

【问题讨论】:

    标签: python dataframe lambda conditional-statements


    【解决方案1】:

    如果我理解正确的话,也许你正在寻找这样的东西:

    def create_tag(current_timestamp, df, cols_vals):
        # Before the current timestamp
        mask = (df['Timestamp'] <= current_timestamp)
        # After the current timestamp - 10s
        mask = mask & (df['Timestamp'] >= current_timestamp - pd.to_timedelta('10s'))
        # Filter all dataframe following the mask
        filtered = df[mask]
        # Check if each val of col is present
        present = all(value in filtered[column_name].values for column_name, value in cols_vals.items())
        return present
            
    data['Tag'] = data['Timestamp'].apply(lambda x: create_tag(x, data, {'column A': 'a', 'column B', 'b'}))
    

    此代码背后的想法是,对于您拥有的每个时间戳,我们将应用 create_tag 函数。这需要当前时间戳、整个数据帧以及包含列名作为键的字典以及您要查找的相应值作为值。

    【讨论】:

    • 感谢@Xelvoz!还有两个简单的问题: 1. 为什么使用 all() 而不是 any()?不确定我是否做对了,但是在使用 all() 时,代码不会检查过滤后的数据框中的所有行是否包含 A 和 B 的值吗? 2. 这可能不是超级计算效率,是吗?
    • 1. all() 函数来自 Python 的标准库,它检查可迭代对象中的所有值是否为真。我这样做是因为当您指定 a 和 b 都应该存在时,您将“和”加粗。 2. 你说得对,一般使用 apply 可能效率不高,但这是我知道的唯一方法,我用这种方法解决这类问题,仍然比 for 循环更有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2019-12-29
    • 2016-11-16
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多