[英]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
)和最后一个( v2
) True
值:
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
是具有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
并重新索引
这是基于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.