我有这样一个数据帧:
Name_A ¦ date1 ¦ 1
Name_A ¦ date2 ¦ 0
Name_A ¦ date3 ¦ 1
Name_A ¦ date4 ¦ 1
Name_A ¦ date5 ¦ 1
Name_B ¦ date6 ¦ 1
Name_B ¦ date7 ¦ 1
Name_B ¦ date8 ¦ 0
Name_B ¦ date9 ¦ 1
我想得到这个:
^{pr2}$
基本上我想得到连续的1的累计和,如果名字改变或者有0,它应该从0开始计数。在
有什么想法/建议吗?谢谢。在
Tags:
以下是一个无需显式循环的矢量化解决方案:
以下是我自己的看法:
这将使用compare-cumsum-groupby模式来查找相邻的组,因为
df[2].diff().ne(0)
每当一个值与前面的值不同时,df[2].diff().ne(0)
会给我们一个真值,而这些值的累计和在新的1组开始时给我们一个新的数字。在当然,这意味着对于跨越不同名称的二进制值,我们有相同的group_id,但是由于我们是根据两个df[0](名称)和group_id分组的,所以我们没问题。在
我像这样重建了你的数据:
对于您建议的分组类型,我喜欢使用
^{pr2}$itertools.groupby
而不是pd.groupby
,这样我可以显式地声明您指定的两个条件(name change和value列中的0):现在正确的组已经存在,剩下的就是迭代,然后计算累计和:
^{3}$结果:
有关参考,请参阅有关
itertools.groupby
here的说明。在相关问题 更多 >
编程相关推荐