2015-12-15 17 views
0

我有一個熊貓數據幀groupby物體看起來像下面這樣:選擇值

 ID 
2014-11-30 1 
     2 
     3 
2014-12-31 1 
     2 
     3 
     4 
2015-01-31 2 
     3 
     4 
2015-02-28 1 
     3 
     4 
     5 
2015-03-31 1 
     2 
     4 
     5 
     6 
2015-04-30 3 
     4 
     5 
     6 

我想要做的就是創建另一個數據框其中GROUPBY值日期x是在每個組中由y(x-1)到y(xn)組成的值,其中y是前一個groupby的n個週期。例如,如果n = 1,那麼如果x group by期間是'2015-04-30',那麼您將檢查'2015-03-31'。如果n = 2,那麼如果groupby日期'2015-02-28',那麼您將檢查groupby日期['2015-01-31','2014-12-31']。

從上面得到的數據幀是這樣對於n = 1:

 ID 
2014-12-31 1 
     2 
     3 
2015-01-31 2 
     3 
     4 
2015-02-28 3 
     4 
2015-03-31 1 
     4 
     5 
2015-04-30 4 
     5 
     6 

對於n = 2所得到的數據幀將是:

2015-01-31 2 
     3 
2015-02-28 3 
     4 
2015-03-31 4 
2015-04-30 4 
     5 

期待一些Python的解決方案!

回答

1

這似乎工作:

def filter_unique(df, n): 
    data_by_date = df.groupby('date')['ID'].apply(lambda x: x.tolist()) 

    filtered_data = {} 
    previous = [] 
    for i, (date, data) in enumerate(data_by_date.items()): 
     if i >= n: 
      if len(previous)==1: 
       filtered_data[date] = list(set(previous[i-n]).intersection(data)) 
      else: 
       filtered_data[date] = list(set.intersection(*[set(x) for x in previous[i-n:]]).intersection(data)) 
     else: 
      filtered_data[date] = data 
     previous.append(data) 

    result = pd.DataFrame.from_dict(filtered_data, orient='index').stack() 
    result.index = result.index.droplevel(1) 

filter_unique(df, 2) 

1/31/15  2 
1/31/15  3 
1/31/15  4 
11/30/14 1 
11/30/14 2 
11/30/14 3 
12/31/14 2 
12/31/14 3 
2/28/15  1 
2/28/15  3 
3/31/15  1 
3/31/15  4 
4/30/15  4 
4/30/15  5 
+0

這樣做工作,所以謝謝你。我認爲可能有更有效的方法。將保持我的眼睛爲一。再次感謝。 – clg4