我有一个带有重复索引的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)
任何帮助将非常感激.
您可以将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_index。v1然后,获取第一个 ( ) 和最后一个 ( 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)
| 归档时间: |
|
| 查看次数: |
199 次 |
| 最近记录: |