2016-06-01 74 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