Python:如果groupby中任何前一行中的值满足特定条件,则从数据帧中删除一行

Python:如果groupby中任何前一行中的值满足特定条件,则从数据帧中删除一行,python,pandas,row,slice,Python,Pandas,Row,Slice,我正在尝试从groupby中删除数据,只要一周的非连续时间超过1次。i、 e.如果一周内有间隙,则我希望通过删除该组中的该行和后续行。下面是一个简单的示例,说明了我所拥有的数据的结构类型,以及我所寻找的理想输出。数据需要按国家和产品分组 import pandas as pd data = {'Country' : ['US','US','US','US','US','DE','DE','DE','DE','DE'],'Product' : ['Coke','Coke','Co

我正在尝试从groupby中删除数据,只要一周的非连续时间超过1次。i、 e.如果一周内有间隙,则我希望通过删除该组中的该行和后续行。下面是一个简单的示例,说明了我所拥有的数据的结构类型,以及我所寻找的理想输出。数据需要按国家和产品分组

import pandas as pd

data = {'Country' : ['US','US','US','US','US','DE','DE','DE','DE','DE'],'Product' :         ['Coke','Coke','Coke','Coke','Coke','Apple','Apple','Apple','Apple','Apple'],'Week' : [1,2,3,4,6,1,2,3,5,6] }

df = pd.DataFrame(data)

print df

#Current starting Dataframe.
  Country Product  Week
0      US    Coke     1
1      US    Coke     2
2      US    Coke     3
3      US    Coke     4
4      US    Coke     6
5      DE   Apple     1
6      DE   Apple     2
7      DE   Apple     3
8      DE   Apple     5
9      DE   Apple     6

#Ideal Output below:
  Country Product  Week
0      US    Coke     1
1      US    Coke     2
2      US    Coke     3
3      US    Coke     4
5      DE   Apple     1
6      DE   Apple     2
7      DE   Apple     3
因此,美国焦炭的产量减少了第6周,因为前一周是第4周。 对于DE Apple,第5周和第6周被删除,因为前一周到第5周为3周。注意,这也消除了第6周的DE Apple,即使之前的值是5或1的diff()。

这应该有效

df.groupby(['Country', 'Product']).apply(lambda sdf: sdf[(sdf.Week.diff(1).fillna(1) != 1).astype('int').cumsum() == 0]).reset_index(drop=True)
另一种可能更具可读性的方法(即,生成一组连续的周,并对照观察到的周进行检查)


你可以试试这个方法

def eliminate(x):
    x['g'] = x['Week'] - np.arange(x.shape[0])
    x = x[x['g'] == x['g'].min()]
    x = x.drop('g',1)

    return x

out  = df.groupby('Product').apply(eliminate).reset_index(level=0,drop=True)

谢谢,它成功地降低了美国可口可乐6号和苹果5号。但是DE Apple 6仍然存在。谢谢,第一个现在可以工作了,但是如果我将.cumsum()==1更改为.cumsum()!=1] )太完美了。第二个我喜欢的逻辑对我来说添加一个额外的列更容易理解,但我收到了一些奇怪的错误消息。“TypeError:插入列的索引与框架索引不兼容”感谢您的所有输入。感谢@ZJS,这让我很好地了解了如何使用函数而不是lambda,拉姆达斯还是把我搞糊涂了。当我运行你的代码时,它看起来很好,除了第4周它似乎也掉了下来,这是我需要维护的,因为它仍然按照前一周的顺序进行。
def eliminate(x):
    x['g'] = x['Week'] - np.arange(x.shape[0])
    x = x[x['g'] == x['g'].min()]
    x = x.drop('g',1)

    return x

out  = df.groupby('Product').apply(eliminate).reset_index(level=0,drop=True)