【问题标题】:look for patterns in a column of pandas dataframe based on the value of other column根据其他列的值在 pandas 数据框中的列中查找模式
【发布时间】:2023-03-28 07:15:01
【问题描述】:

我有以下数据框:

在 key==1 的每一行中,我想在 s_w 列中搜索该行之前和之后出现的两次 1(其中 key==1),然后为这些行求和 v 的值并将其放入一个新的X 列。这些 1 的出现不一定是连续的,在 s_w 列中可能存在间隔,例如 11....11 或 101....10001,但如果我们未能在 s_w 列中找到两个 1在该行之前或之后(其中 key==1),然后我们将 NaN 放在 X 列中。对于 key==0 的行也是 NaN。

编辑:一个新的数据框来测试解决方案是否能很好地概括:

 df = pd.DataFrame( { "p":[1,1,1,1,1,1,1,1,1,1,1,1,1],
                 "l" :[1,1,1,1,1,1,1,1,1,1,1,1,1],
                 "w":[1,2,3,4,5,6,7,8,9,10,11,12,12],
                 "s_w":[1,1,0,0,0,0,1,0,0,0,0,1,1],
                 "key" :[1,1,0,0,0,1,0,1,0,0,0,0,1],
                 "v":[2,2,5,3,4,5,5,1,2,3,4,5,4]
               })

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    我认为这里有必要只将Series.where添加到previous answer添加掩码:

    g = df[df['s_w'].eq(1)].groupby(['p','l'])['v']
    df['c_s'] = g.shift(-1).add(g.shift(-2)).add(g.shift(2)).add(g.shift(1)).where(df['key'].eq(1))
    
    
    print (df)
        p  l   w  s_w  key  v   c_s
    0   1  1   1    1    1  2   NaN
    1   1  1   2    1    1  2   NaN
    2   1  1   3    0    0  5   NaN
    3   1  1   4    0    0  3   NaN
    4   1  1   5    0    0  4   NaN
    5   1  1   6    1    1  5  10.0 <- 2 + 2 + 5 + 1
    6   1  1   7    1    0  5   NaN
    7   1  1   8    1    1  1  19.0 <- 5 + 5 + 5 + 4
    8   1  1   9    0    0  2   NaN
    9   1  1  10    0    0  3   NaN
    10  1  1  11    0    0  4   NaN
    11  1  1  12    1    0  5   NaN
    12  1  1  12    1    1  4   NaN
    

    【讨论】:

    • 谢谢,但我不认为这是正确的,它适用于这个特定的例子和所有 key==1 发生在 s_w 也是 1 的例子,换句话说,如果你有 key==1 但该行的 s_w 不是 1 它失败了,我添加了一个新的数据框来提问,这有助于通用解决方案
    • 如果我们这样做,问题就会得到解决` g = df[df['s_w'].eq(1) | df['key'].eq(1) ].groupby(['p','l'])['v']` 但我正在寻找一种不包括 df['key'] 的方法。等式(1)。如果我们可以在 groupby 中不包含 df['key'].eq(1) 的情况下做同样的事情,它将更好地匹配我原来的问题
    • 我没有想到要做我在之前评论中描述的事情。
    • 对上述内容有什么想法吗?
    猜你喜欢
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2020-12-05
    • 2020-03-16
    • 2017-06-02
    相关资源
    最近更新 更多