代码之家  ›  专栏  ›  技术社区  ›  yatu Sayali Sonawane

GroupBy搜索第一个和最后一个真值

  •  8
  • yatu Sayali Sonawane  · 技术社区  · 7 年前

    我有一个包含重复索引的pd.series,每个索引都包含一组布尔值:

    FA155    False
    FA155    False
    FA155    False
    FA155    True
    FA155    True
    FA155    True
    FA155    True
    FA155    True
    FA155    False
    

    我试图以一种有效的方式为每个不同的索引做的是,只将序列的第一个和最后一个真值保持为真,并将其余值设置为假。在那些为真的值之间也可能存在假值。

    因此,对于这个样本,结果是:

    FA155    False
    FA155    False
    FA155    False
    FA155    True
    FA155    False
    FA155    False
    FA155    False
    FA155    True
    FA155    False
    

    任何帮助都将不胜感激。

    3 回复  |  直到 6 年前
        1
  •  3
  •   rafaelc    7 年前

    你可以用 loc 具有 idxmax 你的原版 df 你的倒转 东风

    这将产生第一个和最后一个的索引 True 价值观。只需将不同的索引设置为 False 之后。

    例如:

    安装程序

    z = sio("""i    v
    FA154    False
    FA155    False
    FA155    True
    FA155    True
    FA155    True
    FA155    True
    FA155    True
    FA155    False
    FA156    False
    FA156    True
    FA156    False
    FA156    False
    FA156    True""")
    
    df = pd.read_table(z, delim_whitespace=True)
    
        i       v
    0   FA154   False
    1   FA155   False
    2   FA155   True
    3   FA155   True
    4   FA155   True
    5   FA155   True
    6   FA155   True
    7   FA155   False
    8   FA156   False
    9   FA156   True
    10  FA156   False
    11  FA156   False
    12  FA156   True
    

    idxmax()

    这和你的 东风 和使用 reset_index . 然后,首先为您获取索引列表( v1 )最后一个( v2 ) 值:

    v1 = df.groupby("i").v.idxmax().values
    v2 = df[::-1].groupby("i").v.idxmax().values
    

    运用你的逻辑:

    df.loc[v1, "v"] = True & df.loc[v1, "v"]
    df.loc[v2, "v"] = True & df.loc[v2, "v"]
    df.loc[~df.index.isin(np.concatenate([v1,v2])), "v"] = False
    

    使用背后的想法 & 不是偶然设置的 值到 .

    结果:

    >>> df.set_index("i")
    
            v
    i   
    FA154   False
    FA155   False
    FA155   True
    FA155   False
    FA155   False
    FA155   False
    FA155   True
    FA155   False
    FA156   False
    FA156   True
    FA156   False
    FA156   False
    FA156   True
    
        2
  •  1
  •   Mohamed AL ANI    7 年前

    过滤真值,然后聚合以查找第一个和最后一个值。然后可以使用loc替换df中的那些值。 df 是您的数据帧。 col 列的名称 True False 价值观

    df["nb"] = range(df.shape[0])
    df.reset_index(inplace=True)
    
    elem = (df[df[col]==True].groupby("index")["nb"].agg({ "first_True": 'first', "last_True":"last"})).values
    
    indexes_to_False = sum(elem.tolist(), [])
    
    df.loc[indexes_to_False, col] = False
    

    然后你可以放下柱子 nb 如果你愿意的话重新索引

        3
  •  1
  •   rafaelc    7 年前

    这是基于 diff 要获得小组起点,我使用 iloc 两次,因为你需要保持头部和尾部真实

    df1=df.copy()
    df.loc[df]=df.astype(int).diff().ne(0)[df]
    df=df.iloc[::-1]
    df1=df1.iloc[::-1]
    df.loc[df1]+=df1.astype(int).diff().ne(0)[df1]
    df=df.iloc[::-1]