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数据分析模块:numpy、pandas全解

Python/Pandas - 结合 groupby 平均值和最小值

pandas-对列中具有相同值的连续行进行分组和聚合

如何使用 Python 和 Pandas 创建比 RAM 更大的 csv 文件

按连续计数 Pandas Python 分组 [关闭]