两个值匹配 pandas 时的累积计数

Posted

技术标签:

【中文标题】两个值匹配 pandas 时的累积计数【英文标题】:Cumulative count when two values match pandas 【发布时间】:2018-12-05 19:29:26 【问题描述】:

我正在尝试创建一个新的Column,它基于单独的columns 中的值显示cumulative count

所以对于下面的代码,我正在尝试基于CauseAnswer Columns 创建两个新列。所以对于Column Answer 中的值,如果In 位于Column Cause 中,我想在新列中提供累积计数。

import pandas as pd

d = (
    'Cause' : ['In','','','In','','In','In'],
    'Answer' : ['Yes','No','Maybe','No','Yes','No','Yes'],
    )

df = pd.DataFrame(d)

输出:

  Answer Cause
0    Yes    In
1     No      
2  Maybe      
3     No    In
4    Yes      
5     No    In
6    Yes    In

预期输出:

  Answer Cause Count_No Count_Yes
0    Yes    In                  1
1     No                         
2  Maybe                         
3     No    In        1          
4    Yes                         
5     No    In        2          
6    Yes    In                  2

我尝试了以下方法,但出现错误。

df['cumsum'] = df.groupby(['Answer'])['Cause'].cumsum()

【问题讨论】:

【参考方案1】:

这是一种方法-

for val in ['Yes', 'No']:
    cond = df.Answer.eq(val) & df.Cause.eq('In')
    df.loc[cond, 'Count_' + val] = cond[cond].cumsum()

df
#  Cause Answer  Count_Yes  Count_No
#0    In    Yes        1.0       NaN
#1           No        NaN       NaN
#2        Maybe        NaN       NaN
#3    In     No        NaN       1.0
#4          Yes        NaN       NaN
#5    In     No        NaN       2.0
#6    In    Yes        2.0       NaN

【讨论】:

【参考方案2】:

没有 for 循环 :-)

s=df.loc[df.Cause=='In'].Answer.str.get_dummies()
pd.concat([df,s.cumsum().mask(s!=1,'')],axis=1).fillna('')
Out[62]: 
  Answer Cause No Yes
0    Yes    In      1
1     No             
2  Maybe             
3     No    In  1    
4    Yes             
5     No    In  2    
6    Yes    In      2

【讨论】:

以上是关于两个值匹配 pandas 时的累积计数的主要内容,如果未能解决你的问题,请参考以下文章

从 Pandas 数据框中另一个系列分段的日期累积计数创建增量计数

使用 Pandas 计算分组计数时的案例

每个值的累积计数[重复]

直到当前行的累积唯一值计数

R中唯一值的累积计数

Pandas DataFrame groupby,跨列计数和求和