Groupby搜索第一个和最后一个True值

yat*_*atu 9 python pandas

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

FA155    False
FA155    False
FA155    False
FA155    True
FA155    True
FA155    True
FA155    True
FA155    True
FA155    False
Run Code Online (Sandbox Code Playgroud)

我想以有效的方式为每个不同的索引做的是将序列的第一个和最后一个True值保持为True,并将其余值设置为False.True之间也可能存在False值.

因此,对于此示例,结果将是:

FA155    False
FA155    False
FA155    False
FA155    True
FA155    False
FA155    False
FA155    False
FA155    True
FA155    False
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激.

raf*_*elc 3

您可以将locwithidxmax与原始df和倒置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
Run Code Online (Sandbox Code Playgroud)

idxmax()

df这与 get your和 using是一样的reset_indexv1然后,获取第一个 ( ) 和最后一个 ( v2)True值的索引列表:

v1 = df.groupby("i").v.idxmax().values
v2 = df[::-1].groupby("i").v.idxmax().values
Run Code Online (Sandbox Code Playgroud)

并使用你的逻辑:

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
Run Code Online (Sandbox Code Playgroud)

using 背后的想法&是不要意外地将任何False值设置为True.

结果:

>>> 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
Run Code Online (Sandbox Code Playgroud)