2017-10-13 5 views
1

Hallo habe einen Datenrahmen dfmerge Reihen Pandas Datenrahmen basierend auf Bedingung

eine Reihe von Ereignissen (Zeilen) enthält.

df = pd.DataFrame(data=[[1, 2, 7, 10], 
        [10, 22, 1, 30], 
        [30, 42, 2, 10], 
        [100,142, 22,1], 
        [143, 152, 2, 10], 
        [160, 162, 12, 11]],columns=['Start','End','Value1','Value2']) 

df 
Out[15]: 
    Start End Value1 Value2 
0  1 2  7  10 
1  10 22  1  30 
2  30 42  2  10 
3 100 142  22  1 
4 143 152  2  10 
5 160 162  12  11 

Wenn 2 (oder mehr) aufeinander folgende Ereignisse sind < = 10 weit voneinander entfernt würde Ich mag die 2 (oder mehr) Ereignisse fusionieren (dh den Beginn des ersten Ereignisses verwendet werden, das Ende der letzten und die Summe des Werte in Value1 und Value2).

Im Beispiel oben df wird:

df 
Out[15]: 
    Start End Value1 Value2 
0  1 42  10  50 
1 100 162  36  22 

Antwort

3

, die durchaus möglich ist:

df.groupby(((df.Start - df.End.shift(1)) > 10).cumsum()).agg({'Start':min, 'End':max, 'Value1':sum, 'Value2': sum}) 

Erläuterung:

start_end_differences = df.Start - df.End.shift(1) #shift moves the series down 
threshold_selector = start_end_differences > 10 # will give you a boolean array where true indicates a point where the difference more than 10. 
groups = threshold_selector.cumsum() # sums up the trues (1) and will create an integer series starting from 0 
df.groupby(groups).agg({'Start':min}) # the aggregation is self explaining 

Hier ist eine allgemeine Lösung, die von Agnostiker bleibt die anderen Spalten:

cols = df.columns.difference(['Start', 'End']) 
grps = df.Start.sub(df.End.shift()).gt(10).cumsum() 
gpby = df.groupby(grps) 
gpby.agg(dict(Start='min', End='max')).join(gpby[cols].sum()) 

    Start End Value1 Value2 
0  1 42  10  50 
1 100 162  36  22 
+0

Schöne Antwort. Plus eins. – piRSquared

+1

Ich habe deine Antwort bearbeitet. Fühlen Sie sich frei, es zu entfernen, wenn Sie es nicht mögen. – piRSquared

Verwandte Themen