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