2016-06-01 21 views
1

ich Pandas Dataframe df wie dieseDividieren Reihen von Python Pandas Dataframe

mat time 
0 101 20 
1 102 7 
2 103 15 

habe ich brauche, um die Reihen zu unterteilen, so dass die Spalte Zeit hat keine Werte höher als t=10 so etwas wie diese

haben
mat time 
0 101 10 
2 101 10 
3 102 7 
4 103 10 
5 103 5 

der Index keine Rolle spielt

Wenn ich groupby ('mat') [ 'Zeit']. sum() auf dieser df verwenden würde, würde ich das Originalhaben, aber ich brauche eine Umkehrung der groupby func.

Gibt es eine Möglichkeit, den ungrouped DataFrame mit der Bedingung time <= t zu erhalten?

Ich versuche hier eine Schleife zu verwenden, aber es ist eine Art ‚unPythonic‘, irgendwelche Ideen?

Antwort

1

apply eine Funktion verwenden, die bis alle Schleifen sind weniger als 10.

def split_max_time(df): 
    new_df = df.copy() 
    while new_df.iloc[-1, -1] > 10: 
     temp = new_df.iloc[-1, -1] 
     new_df.iloc[-1, -1] = 10 
     new_df = pd.concat([new_df, new_df]) 
     new_df.iloc[-1, -1] = temp - 10 
    return new_df 


print df.groupby('mat', group_keys=False).apply(split_max_time) 

    mat time 
0 101 10 
0 101 10 
1 102  7 
2 103 10 
2 103  5 
1

Sie könnten .groupby('mat').apply() und eine Kombination aus integer Teilung und modulo Betrieb der cutoff (10) unter Verwendung jedes time Wert in die zersetzen gewünschte Komponenten:

cutoff = 10 
def decompose(time): 
    components = [cutoff for _ in range(int(time/cutoff))] + [time.iloc[0] % cutoff] 
    return pd.Series([c for c in components if c > 0]) 

df.groupby('mat').time.apply(decompose).reset_index(-1, drop=True) 

zu erhalten:

mat 
101 10 
101 10 
102  7 
103 10 
103  5 

Bei sorgen Sie über die Leistung:

%timeit df.groupby('mat', group_keys=False).apply(split_max_time) 
100 loops, best of 3: 4.21 ms per loop 

%timeit df.groupby('mat').time.apply(decompose).reset_index(-1, drop=True) 
1000 loops, best of 3: 1.83 ms per loop 
Verwandte Themen