Python 是否为每一列的出现生成计数,但与另一列有关?

Python 是否为每一列的出现生成计数,但与另一列有关?,python,pandas,Python,Pandas,我有这样一个数据帧: 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/

我有这样一个数据帧:

   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   
   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 
  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
我想生成一个新表,其中包含每台机器的功能出现次数,但仅包含具有相同名称、相同日期但不同票证代码的机器

因此,它可以生成如下所示的新数据帧:

   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   
   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 
  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
例如:
1992年6月1日的
Mach_1
将有
计数
1
,因为它在该日期只出现一次,而
低的
计数为
2
,因为它出现了两次


谢谢大家!

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



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



解释

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

>>> 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
这确保了即使一个值被多次复制,它仍将作为唯一行保留在最终结果中,但不会被聚合,假设您的数据帧如下所示:

   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   
   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 
  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