我有一个大熊猫数据框,其中包含检查日期作为索引以及物种的类别和类型。
Date Category Type
2016-11-21 Cat Animal
2016-11-21 Cat Animal
2017-01-03 Cat Animal
2016-11-01 Dog Animal
2017-01-03 Dog Animal
2016-10-03 Dog Animal
2017-02-01 Dog Animal
2017-03-01 Dog Animal
2016-12-01 Dog Animal
2016-11-21 Horse Animal
2016-12-15 Horse Animal
2017-02-04 Horse Animal
我需要确定每个类别的日期是否连续。连续可能意味着缺少一个月,这在马类中可见。马的一月份缺失了,但总的来说马的检查更新正在增加。所以马是有效的。 然而,猫因为在一天内接受了两次检查而无效。
最终的数据框应该是
Date Category Type
2016-11-01 Dog Animal
2017-01-03 Dog Animal
2016-10-03 Dog Animal
2017-02-01 Dog Animal
2017-03-01 Dog Animal
2016-12-01 Dog Animal
2016-11-21 Horse Animal
2016-12-15 Horse Animal
2017-02-04 Horse Animal
答案 0 :(得分:2)
您似乎需要is_unique
和is_monotonic_increasing
与filter:
df = df.groupby('Category').filter(lambda x: x.index.is_unique and
x.index.is_monotonic_increasing)
print (df)
Category Type
Date
2016-11-21 Horse Animal
2016-12-15 Horse Animal
2017-02-04 Horse Animal
答案 1 :(得分:0)
以下是如何排除索引不唯一的动物:
df.groupby('Category').filter(lambda x: x.index.is_unique)
给出了所需的输出:
Category Type
Date
2016-11-01 Dog Animal
2017-01-03 Dog Animal
2016-10-03 Dog Animal
2017-02-01 Dog Animal
2017-03-01 Dog Animal
2016-12-01 Dog Animal
2016-11-21 Horse Animal
2016-12-15 Horse Animal
2017-02-04 Horse Animal
您的问题建议您希望日期严格增加,然后您可以这样做:
def index_diff(x):
return ((d_1 - d_0).days for d_1, d_0 in zip(x.index[1:], x.index[:-1]))
df.groupby('Category').filter(lambda x: min(index_diff(x))> 0)
虽然这只会返回
Category Type
Date
2016-11-21 Horse Animal
2016-12-15 Horse Animal
2017-02-04 Horse Animal
因为对于Dog,您2017-01-03
2016-10-03