我有一个这样的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
,因为它出现了两次。
谢谢!
答案 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