我有一个带有重复索引的 pd.Series,每个索引都包含一组 bool 值:
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
关于python - Groupby 搜索第一个和最后一个真值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50571537/