我有一个带有重复索引的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
任何帮助将不胜感激。
您可以将loc
其idxmax
与原版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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句