a = [
('xyz1','2018-01-30','Error'),
('xyz1','2018-01-30','Error'),
('xyz1','2018-01-31','OK'),
('xyz2','2018-01-31','OK'),
('abc123','2018-02-04','Error'),
('abc123','2018-02-05','OK'),
]
df =pd.DataFrame(a,columns=['sn','date','status'])
print(df.groupby('date').sn.nunique())
date
2018-01-30 1
2018-01-31 2
2018-02-04 1
2018-02-05 1
Name: sn, dtype: int64
print(df.groupby('date').sn.nunique().cumsum())
date
2018-01-30 1
2018-01-31 3
2018-02-04 4
2018-02-05 5
Name: sn, dtype: int64
但实际上,对于开始日期2018-01-30到2018-02-04的日期,它们共有4个唯一的sn:xyz1,xyz2,abc123,所以预期的cumsum值是3,而不是4,所以使用熊猫cumsum不是一个很好的方法。
如何获得我需要的结果? 谢谢!
答案 0 :(得分:1)
首先,预期4(1 + 2 + 1 = 4)。
要完成任务,您可能需要pandas.Series.duplicated
。
df['not_dup'] = 1 - df.sn.duplicated() #Indicator that 'sn' is not duplicated
df.groupby('date').not_dup.sum().cumsum()
输出:
# date
# 2018-01-30 1
# 2018-01-31 2
# 2018-02-04 3
# 2018-02-05 3
# Name: not_dup, dtype: int32