2017-08-04 1 views
0

Apologies für jede Unklarheit ... Ich bin hier, um die Entsendung ....Python Pandas Binning

Ich arbeite mit Pandas auf einem Datenrahmen, und ich würde jede Eingabe von der Gemeinschaft zu schätzen wissen. Hier ist, was der Datenrahmen wie ... ... sieht hier siehe Screenshot

screenshot of the data frame structure

mein Ziel ist es, einen unabhängigen Datenrahmen, die im Durchschnitt x und y in Bins separat basierend auf T-Schritten von 5 ... zu schaffen ..

Beispiel ... .. für T im Bereich 0-5 => Durchschnittswerte x, y Werte in x1bin, y1bin, dann für T im Bereich 5-10 => Durchschnittswerte x, y Werte in x2bin, y2bin ... ... ..für T im Bereich 10-15 => mittlere x, y Werte in x3bin, y3bin ......... und erhöhe den Wert bis t in tan135-140. In der Zwischenzeit indexieren die Daten zu ID ... .beeindruckend Daten, die zu ID mit ID eins gehören. Wie Sie vielleicht bemerkt haben, wird es einige Fächer mit NAN-Werten geben, weil es entsprechende Ts gibt, und das ist in Ordnung .......

Schließlich könnte es hilfreich sein, die Art, wie ich die T berechnet wissen ......, die eine Walzzeit von A pro ID passiert sein ...... .und beginnt bei 0 mit jeder neuen ID

df [ 'T '] = df.groupby ([' ID ']) .Apply (Lambda x: x - x.iloc [0])/np.timedelta64 (1,' m ')

Vielen Dank im Voraus ... .

+1

[bitte lesen Sie diesen Beitrag] (https://stackoverflow.com/help/how-to-ask) auf, wie um Datenrahmen auf SO zu strukturieren. Schreiben Sie auch ein Beispiel, wie Ihr zweiter Datenrahmen aussieht wie – DJK

Antwort

0

vorausgesetzt df als Datenrahmen

t_range = 5 
t_ranges = np.arange(0,df['T'].max()+1,t_range) 
new_df = pd.DataFrame(columns=['t_range','x_avg','y_avg']) 
for i in range(1,len(t_ranges)): 
    a = df[df['T']>=t_ranges[i-1]][df['T']<t_ranges[i]] 
    x_avg = a['X'].mean() 
    y_avg = a['Y'].mean() 
    new_df = new_df.append({'t_range':t_range[i],'x_avg':x_avg,'y_avg:y_avg},ignore_index=True) 

Beispieldaten df

T X Y 
0 1 2 3 
1 2 3 4 
2 3 4 5 
3 4 5 6 
4 5 6 7 
5 6 7 8 
6 7 8 9 
7 8 9 1 

mit t_range = 2

dh 0-2,2-4,4-6

Probenausgang new_df

 t_range x_avg y_avg 
0  2.0 2.5 3.5 
1  4.0 4.5 5.5 
2  6.0 6.5 7.5 

EDIT: Änderung x_avg und y_avg wie unten angegeben, werden sie jede NaNs, die in den Daten ignorieren, t_range = 2

x_avg = a['X'].dropna().mean() 
y_avg = a['Y'].dropna().mean() 

Abtastdaten

T X Y 
0 1 2.0 6.0 
---------------- t<2 
1 2 NaN NaN 
2 3 7.0 8.0 
---------------- t<4 and t>=2 
3 4 10.0 11.0 
4 5 NaN 14.0 
---------------- t<6 and t>=4 
5 6 1.0 NaN 
6 7 12.0 13.0 
---------------- t<8 and t>=6 
7 8 1.0 2.0 

Ausgang

verwendet
t_range x_avg y_avg 
0 2.0  2.0 6.0 
1 4.0  7.0 8.0 
2 6.0  10.0 12.5 
3 8.0  6.5 13.0 

Ich hoffe, dies beantwortet Ihre zweite Abfrage in den Kommentar. Wenn Sie die Antwort hilfreich gefunden haben, markieren Sie sie Akzeptiert, indem Sie auf das Häkchen neben dieser Antwort klicken

+0

Vielen Dank @Bandi. Das ist sehr hilfreich. Eine letzte Sache ... Wenn ich anstatt der Mittelung die Xs und Ys zusammenfassen wollte, die diesem Bereich von T sowie einer anderen eindeutigen ID entsprechen ... würde ich df.groupby ('T'). Y.sum () ......... Zweitens möchte ich NANs generieren, da T in meinen tatsächlichen Daten nicht kontinuierlich ist und daher bestimmte Zeilen hat, die keine Xs und Ys haben, die diesem T-Bereich entsprechen ...... Ich denke, ich kann näher kommen, um mit dem zu antworten, was Sie bereits zur Verfügung gestellt haben ..Aber wenn Sie irgendwelche Vorschläge haben, werde ich es zu schätzen wissen. Danke – NYSom

+0

Ich habe die Antwort bearbeitet –

+0

Perfekt .... Danke nochmal !! – NYSom