基于布尔值的累计和
Cumulative sum based on a boolean
我有一个如下所示的数据框:
finalcheck
False
True
True
True
False
True
我想在此数据框中创建另一列,它会根据 finalcheck 变量为我提供累计总和,如下所示:
finalcheck
position
False
1
True
2
True
3
True
4
False
1
True
2
我尝试了多种方法来实现这一点,但我能得到的最接近的方法是在 pandas:
中使用带有 cumsum 函数的 groupby
df['position'] = df.groupby((df.finalcheck).cumsum())
这没有给我想要的输出。你能帮我找出我哪里出错了吗?
这是一个 gap-and-island 问题。每次遇到 False 时,您都会开始一个新的岛屿。然后在每个岛内,您只需按顺序对行进行编号:
# The islands
s = df["finalcheck"].eq(False).cumsum()
# Within each island, label the rows sequentially
df['position'] = s.groupby(s).cumcount() + 1
summ = 0
for i in range(0,len(df)):
if df["finalcheck"].iloc[i] == "True":
summ = summ + 1
df["position"].iloc[i] = summ
else:
summ = 0
如果你不考虑 groupby,你可以试试这个
我有一个如下所示的数据框:
finalcheck |
---|
False |
True |
True |
True |
False |
True |
我想在此数据框中创建另一列,它会根据 finalcheck 变量为我提供累计总和,如下所示:
finalcheck | position |
---|---|
False | 1 |
True | 2 |
True | 3 |
True | 4 |
False | 1 |
True | 2 |
我尝试了多种方法来实现这一点,但我能得到的最接近的方法是在 pandas:
中使用带有 cumsum 函数的 groupbydf['position'] = df.groupby((df.finalcheck).cumsum())
这没有给我想要的输出。你能帮我找出我哪里出错了吗?
这是一个 gap-and-island 问题。每次遇到 False 时,您都会开始一个新的岛屿。然后在每个岛内,您只需按顺序对行进行编号:
# The islands
s = df["finalcheck"].eq(False).cumsum()
# Within each island, label the rows sequentially
df['position'] = s.groupby(s).cumcount() + 1
summ = 0
for i in range(0,len(df)):
if df["finalcheck"].iloc[i] == "True":
summ = summ + 1
df["position"].iloc[i] = summ
else:
summ = 0
如果你不考虑 groupby,你可以试试这个