生成每列但与另一列有关的计数?

时间:2019-09-06 15:58:09

标签: python pandas

我有一个这样的DataFrame:

   Machine |    Date   | ticket | Heavy | Med | Low |  
    Mach_1    1/2/1992    abb       1      0     0    
    Mach_1    1/6/1992    abb       1      0     1     
    Mach_1    1/6/1992    att       0      0     1     
    Mach_2    1/2/1992    avm       1      0     0     
    Mach_2    1/14/1992   avm       1      0     0   
    Mach_2    1/2/1992    avm       1      0     0   

我想生成一个新表,其中包含每台机器的功能的出现次数,但只有名称,日期和票据代码不同的机器。

这样它可以生成一个新的DataFrame:

   Machine |    Date    | Heavy | Med | Low |  
    Mach_1    1/2/1992      1      0     0    
    Mach_1    1/6/1992      1      0     2        
    Mach_2    1/2/1992      1      0     0     
    Mach_2    1/14/1992     1      0     0   
    Mach_2    1/2/1992      1      0     0 

ex:Mach_1上的1/6/1992的{​​{1}}计数为Heavy,因为它仅在该日期出现一次,但计数为1 2,因为它出现了两次。

谢谢!

2 个答案:

答案 0 :(得分:1)

先删除重复项,然后groupby和sum()

df.drop_duplicates(['Machine', 'Date', 'ticket']).groupby(['Machine', 'Date']).sum()

                   Heavy  Med  Low
Machine Date                      
Mach_1  1/2/1992       1    0    0
        1/6/1992       1    0    2
Mach_2  1/14/1992      1    0    0
        1/2/1992       1    0    0

答案 1 :(得分:1)

使用duplicated + groupby。这是一个棘手的问题,因为您想保留重复的行,而只是不想sum。解决方案是确保使用id为每个重复的行分配一个新的cumsum,然后在我们的分组中使用该键。


d = df.duplicated(['Machine', 'Date', 'ticket'])
never_group = d.groupby(d).cumsum()

df.groupby(['Machine', 'Date', never_group], as_index=False, sort=False).sum()

  Machine       Date  Heavy  Med  Low
0  Mach_1   1/2/1992      1    0    0
1  Mach_1   1/6/1992      1    0    2
2  Mach_2   1/2/1992      1    0    0
3  Mach_2  1/14/1992      1    0    0
4  Mach_2   1/2/1992      1    0    0

说明

找到重复的值有助于我们生成组。

>>> d = df.duplicated(['Machine', 'Date', 'ticket'])
>>> d
0    False  
1    False  
2    False  
3    False  
4    False  
5     True  
dtype: bool 

接下来,我们必须确保所有重复的值都分配有唯一键

>>> d.groupby(d).cumsum().view('i1')
0    0
1    0
2    0
3    0
4    0
5    1
dtype: int8

这样可以确保即使重复重复一个值,它也将作为唯一行保留在最终结果中,但不会被汇总,可以说您的DataFrame如下所示:

  Machine       Date ticket  Heavy  Med  Low
0  Mach_1   1/2/1992    abb      1    0    0
1  Mach_1   1/6/1992    abb      1    0    1
2  Mach_1   1/6/1992    att      0    0    1
3  Mach_2   1/2/1992    avm      1    0    0
4  Mach_2  1/14/1992    avm      1    0    0
5  Mach_2   1/2/1992    avm      1    0    0
6  Mach_2   1/2/1992    avm      1    0    0

我们有三个重复值,需要分开保存

>>> d = df.duplicated(['Machine', 'Date', 'ticket'])
>>> d.groupby(d).cumsum()
0    0.0
1    0.0
2    0.0
3    0.0
4    0.0
5    1.0
6    2.0
dtype: float64