繁体   English   中英

在 pandas 中创建具有递归操作的条件 dataframe 列

[英]Creating a conditional dataframe column with recursive action in pandas

我有一个如下的df:

 time sb bn bs 2020-04-07 True False 2020-04-08 True False 2020-04-09 True False 2020-04-13 False False 2020-04-14 False False 2020-04-15 False False 2020-04-16 False False 2020-04-17 False False 2020-04-20 False False 2020-04-21 False True 2020-04-22 False False 2020-04-23 False False

条件如下:

if -> bn and !sb then True
else if -> bs[1] and sb then False
else -> bs[1]

我的代码:

conditions = [
    (df["bn"] == True) & (df["sb"] == False),
    (df["bs"].shift(1) == True) & (df["sb"] == True)]
choices = ["True", "False"]
df["bs"] = np.select(conditions, choices, default=df["bs"].shift(1))

我收到 object 不可调用错误。 我认为是因为.shift(1)。 (我对前几天的数据使用 shift(1) )具有新 bs 列的所需 df 应该如下所示:

 time sb bn bs 2020-04-07 True False False 2020-04-08 True False False 2020-04-09 True False False 2020-04-13 False False False 2020-04-14 False False False 2020-04-15 False False False 2020-04-16 False False False 2020-04-17 False False False 2020-04-20 False False False 2020-04-21 False True True 2020-04-22 False False True 2020-04-23 False False True

我究竟做错了什么? 谢谢

由于您需要定义分配的条件中的前一个值,因此我认为没有比仅使用for循环更好的方法了。 请注意,我们需要单独处理第一行,因为在这种情况下没有先前的值。 您可以通过最初将所有bs值设置为False来缩短条件表达式。

df['bs'] = np.repeat(False, len(df))

if df.bn[0] and not df.sb[0]:
    df.bs[0] = True

for i in range(1, len(df)):
    if df.bn[i] and not df.sb[i]:
        df.bs[i] = True
    else:
        if not (df.bs[i-1] and df.sb[i]):
            df.bs[i] = df.bs[i-1]          

df
            sb      bn      bs
2020-04-07  True    False   False
2020-04-08  True    False   False
2020-04-09  True    False   False
2020-04-13  False   False   False
2020-04-14  False   False   False
2020-04-15  False   False   False
2020-04-16  False   False   False
2020-04-17  False   False   False
2020-04-20  False   False   False
2020-04-21  False   True    True
2020-04-22  False   False   True
2020-04-23  False   False   True

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM