簡體   English   中英

Python Pandas:如果groupby中任何前面的行中的值滿足特定條件,則從數據框中刪除一行

[英]Python Pandas: Eliminate a row from a dataframe if a value in a any preceding row in a groupby meets a certain criteria

一旦周變得不連續超過1,我試圖從groupby中刪除數據。即,如果一周中有間隔,則我要刪除group by中的該行和后續行。 以下是我擁有的數據結構的簡單示例,也是我想要的理想輸出。 數據需要按國家和產品分組。

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 Week 5和6,因為到第5周的前一周是3,因此刪除了它。或diff()為1。

這應該工作

df.groupby(['Country', 'Product']).apply(lambda sdf: sdf[(sdf.Week.diff(1).fillna(1) != 1).astype('int').cumsum() == 0]).reset_index(drop=True)

另一種方法可能更具可讀性(即生成一組連續的星期並對照觀察到的星期進行檢查)

df['expected_week'] = df.groupby(['Country', 'Product']).Week.transform(lambda s: range(s.min(), s.min() + s.size))
df[df.Week == df.expected_week]

您可以嘗試這種方法...

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM