繁体   English   中英

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

[英]Groupby search first and last True values

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

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

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

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

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

任何帮助将非常感激。

你可以使用带有idxmax loc和你的原始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

idxmax()

这与获取你的df并使用reset_index 然后,首先获取索引列表( v1 )和最后一个( v2True值:

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

使用&后面的想法是不会意外地将任何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

您筛选True值,然后聚合以查找第一个和最后一个值。 然后你可以使用loc来替换df中的那些值。 df是你的数据帧。 col是具有TrueFalse值的列的名称

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并重新索引

这是基于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]

暂无
暂无

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

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