2017-11-25 265 views
1

我有一個熊貓數據幀,看起來像這樣:熊貓 - GROUPBY連續日期時間段

KEY START  END   VALUE 
0 A  2017-01-01 2017-01-16 2.1 
1 B  2017-01-01 2017-01-23 4.3 
2 B  2017-01-23 2017-02-10 1.7 
3 A  2017-01-28 2017-02-02 4.2 
4 A  2017-02-02 2017-03-01 0.8 

我想groupbyKEYsumVALUE但僅限於時間連續句。因爲在該時間段的空隙

A
KEY START  END   VALUE 
0 A 2017-01-01 2017-01-16 2.1 
1 A 2017-01-28 2017-03-01 5.0 
2 B 2017-01-01 2017-02-10 6.0 

有二組:比如在上面的例子中,我想獲得。 我想避免循環,因爲數據幀有數千萬行。

回答

1

創建由每組比較shiftSTART列,並用它來groupby幫手Series

s = df.loc[df.groupby('KEY')['START'].shift(-1) == df['END'], 'END'] 
s = s.combine_first(df['START']) 
print (s) 
0 2017-01-01 
1 2017-01-23 
2 2017-01-23 
3 2017-02-02 
4 2017-02-02 
Name: END, dtype: datetime64[ns] 

df = df.groupby(['KEY', s], as_index=False).agg({'START':'first','END':'last','VALUE':'sum'}) 
print (df) 
    KEY VALUE  START  END 
0 A 2.1 2017-01-01 2017-01-16 
1 A 5.0 2017-01-28 2017-03-01 
2 B 6.0 2017-01-01 2017-02-10 
+0

謝謝。但是,這一次只彙集兩行。任何想法如果我有與原始問題中描述的相同的數據框,再加上'START'= 2017-03-01和'2017-03-31'爲'END'的附加行,我可以如何修改您的解決方案?在這種情況下,從2017-01-28到2017-03-31有一個完全連續的時期,3行應該彙總在一起。 – Prikers

+0

不是那麼容易,我嘗試找到解決方案,但如果需要更快,您能創建新問題嗎? – jezrael

0

從jezrael答案就像一個魅力,如果有隻聚合兩個連續的行。在新示例中,它不會聚合KEY = A的最後三行。

 KEY START  END   VALUE 
0 A  2017-01-01 2017-01-16 2.1 
1 B  2017-01-01 2017-01-23 4.3 
2 B  2017-01-23 2017-02-10 1.7 
3 A  2017-01-28 2017-02-02 4.2 
4 A  2017-02-02 2017-03-01 0.8 
5 A  2017-03-01 2017-03-23 1.0 

以下解決方案(jezrael的解決方案稍作修改)使聚合應累計的所有行:

df = df.sort_values(by='START') 
idx = df.groupby('KEY')['START'].shift(-1) != df['END'] 
df['DATE'] = df.loc[idx, 'START'] 
df['DATE'] = df.groupby('KEY').DATE.fillna(method='backfill') 
df = (df.groupby(['KEY', 'DATE'], as_index=False) 
     .agg({'START': 'first', 'END': 'last', 'VALUE': 'sum'}) 
     .drop(['DATE'], axis=1)) 

其中給出:

KEY START   END  VALUE 
0 A 2017-01-01 2017-01-16 2.1 
1 A 2017-01-28 2017-03-23 6.0 
2 B 2017-01-01 2017-02-10 6.0 

感謝@jezrael爲優雅接近!