划分python pandas DataFram的行

2024-04-20 01:47:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据框架^{cd1>}这样

   mat  time
0  101   20
1  102    7
2  103   15

我需要划分行,这样时间列没有任何高于^{{cd2>}的值,这样的值就可以了

^{pr2}$

索引不重要

如果我在这个df上使用groupby('mat')['time'].sum(),我将拥有原始的^{cd1>},但我需要一个groupby funct的逆。

有没有方法在^{{cd5>}条件下获得^{cd4>}数据帧?

我想用一个循环,但这有点“不太好”,有什么想法吗?


Tags: 数据方法框架dftime时间条件sum
2条回答

您可以.groupby('mat').apply()组合使用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)

获得:

^{pr2}$

如果您关心性能:

%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

使用一个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

相关问题 更多 >