2016-06-01 73 views
1

我有一個熊貓數據幀df這樣鴻溝行

mat time 
0 101 20 
1 102 7 
2 103 15 

我需要劃分的行,所以時間的列沒有比t=10更高的任何值有這樣的事情

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

指數不要緊

如果我會使用GROUPBY(「墊」)「時間」。這個DF總和()我將有原來df,但我需要像func的反函數。

有沒有什麼辦法讓ungrouped數據幀的條件爲time <= t

我想在這裏使用一個循環,但它是一種'unpythonic',任何想法?

回答

1

使用的apply功能循環,直到全部小於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

你可以.groupby('mat').apply()integer劃分和使用modulo操作的組合cutoff10)每個time值分解成所需組件:

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) 

獲得:

mat 
101 10 
101 10 
102  7 
103 10 
103  5 

如果你關心性能:

%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