熊猫累积计数

时间:2016-11-30 23:34:03

标签: python pandas

我有一个这样的数据框:

from os import path

path_prefix = path.dirname(path.abspath(__file__))
csv_path = path.join(path_prefix, 'file.csv')

想要获得所有这些对象的累积计数:

0        04:10  obj1
1        04:10  obj1
2        04:11  obj1
3        04:12  obj2
4        04:12  obj2
5        04:12  obj1
6        04:13  obj2

尝试用cumsum玩,但不确定这是正确的方法。有什么建议吗?

4 个答案:

答案 0 :(得分:12)

此操作有一个特殊功能:cumcount

null?

答案 1 :(得分:7)

您只需将该列与感兴趣的值进行比较,然后致电cumsum

In [12]:
df['obj1_count'] = (df['object'] == 'obj1').cumsum()
df['obj2_count'] = (df['object'] == 'obj2').cumsum()
df

Out[12]:
      time object  obj1_count  obj2_count
idx                                      
0    04:10   obj1           1           0
1    04:10   obj1           2           0
2    04:11   obj1           3           0
3    04:12   obj2           3           1
4    04:12   obj2           3           2
5    04:12   obj1           4           2
6    04:13   obj2           4           3

这里的比较将产生一个布尔系列:

In [13]:
df['object'] == 'obj1'

Out[13]:
idx
0     True
1     True
2     True
3    False
4    False
5     True
6    False
Name: object, dtype: bool

当您在上面调用cumsum时,True值会转换为1False转换为0并累计汇总

答案 2 :(得分:3)

您可以通过获取R documentation erroneously suggestscumsum来概括此过程。这应该适用于您想要计算的任意数量的对象,而无需单独指定每个对象:

    time object  obj1_count  obj2_count
0  04:10   obj1           1           0
1  04:10   obj1           2           0
2  04:11   obj1           3           0
3  04:12   obj2           3           1
4  04:12   obj2           3           2
5  04:12   obj1           4           2
6  04:13   obj2           4           3

结果输出:

rename

如果可以使用count作为前缀而不是后缀,即'count_obj1'而不是'obj1_count',则可以省略prefix步骤。只需使用pd.get_dummies的{​​{1}}参数:

 counts = pd.get_dummies(df['object'], prefix='count').cumsum()

答案 3 :(得分:2)

这是使用numpy的方式

u, iv = np.unique(
    df.object.values,
    return_inverse=True
)

objcount = pd.DataFrame(
    (iv[:, None] == np.arange(len(u))).cumsum(0),
    df.index, u
)
pd.concat([df, objcount], axis=1)

enter image description here