python pandas - 创建一个保持连续值运行计数的列
Posted
技术标签:
【中文标题】python pandas - 创建一个保持连续值运行计数的列【英文标题】:python pandas - creating a column which keeps a running count of consecutive values 【发布时间】:2016-01-12 20:26:36 【问题描述】:我正在尝试创建一个列(“consec”),它将在另一个(“二进制”)中保持连续值的运行计数,而不使用循环。这就是期望的结果:
. binary consec
1 0 0
2 1 1
3 1 2
4 1 3
5 1 4
5 0 0
6 1 1
7 1 2
8 0 0
不过,这……
df['consec'][df['binary']==1] = df['consec'].shift(1) + df['binary']
结果...
. binary consec
0 1 NaN
1 1 1
2 1 1
3 0 0
4 1 1
5 0 0
6 1 1
7 1 1
8 1 1
9 0 0
我看到其他使用分组或排序的帖子,但不幸的是,我看不出这对我有什么用。提前感谢您的帮助。
【问题讨论】:
你说“连续”,但是0和1不同,你还是增加计数器。所以感觉更像是你想在每个零处重置计数器。如果连续两个零,你想发生什么? 好点 - 糟糕的描述,我确实想在每个零处重置计数器。所以 df['binary'] 中的连续 0 会在 df['consec'] 中生成 0。 【参考方案1】:您可以使用 compare-cumsum-groupby 模式(我真的需要花时间来编写文档),最后是 cumcount
:
>>> df = pd.DataFrame("binary": [0,1,1,1,0,0,1,1,0])
>>> df["consec"] = df["binary"].groupby((df["binary"] == 0).cumsum()).cumcount()
>>> df
binary consec
0 0 0
1 1 1
2 1 2
3 1 3
4 0 0
5 0 0
6 1 1
7 1 2
8 0 0
这是可行的,因为首先我们获得了要重置计数器的位置:
>>> (df["binary"] == 0)
0 True
1 False
2 False
3 False
4 True
5 True
6 False
7 False
8 True
Name: binary, dtype: bool
这些的累积总和为我们提供了每个组的不同 id:
>>> (df["binary"] == 0).cumsum()
0 1
1 1
2 1
3 1
4 2
5 3
6 3
7 3
8 4
Name: binary, dtype: int64
然后我们可以将其传递给groupby
并使用cumcount
来获得每个组中的递增索引。
【讨论】:
将是对文档的一个很好的补充,可能在 Cookbook 中。 大吃一惊。如果 pan['A'] = df ,是否有任何理由这不适用于代替数据框的面板? 无视 DSM - 想通了。感谢您的帮助! 如果第一个元素是 1,这将无法正常工作。【参考方案2】:对于那些最终在这里寻找“被误解”版本答案的人: 重置 binary 列中每个更改的计数,以便 consec 确实“保持连续计数值”,以下似乎有效:
df["consec2"] = df["binary"].groupby((df["binary"] <> df["binary"].shift()).cumsum()).cumcount()
【讨论】:
以上是关于python pandas - 创建一个保持连续值运行计数的列的主要内容,如果未能解决你的问题,请参考以下文章
Python - Pandas - 只删除只有数字的拆分,但如果它有字母则保持
Python/Pandas - 结合 groupby 平均值和最小值