熊猫在元素上循环

时间:2018-07-03 08:35:54

标签: python performance pandas loops dataframe

我想在某个条件下计算数据帧中的增量时间,所以我写了一个循环:

for i in range(1,len(df.index)):
    if df.type[i] == df.type[i-1]:
        df.delta[i]=df.time[i]-df.time[i-1]
    else:
        df.delta[i]= ''

,但是它似乎不是很优化,因为它很长,我得到了SettingWithCopyWarning(我不理解)。进行这种计算的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

我会使用.shift()。它将创建一个新列,其值将偏移1。 因此,如果我们没有条件,则只需要df["time"] - df["time"].shift(),但是要添加条件,where会有所帮助。所以这是一个单行解决方案

(df["time"] - df["time"].shift()).where(df["type"] == df["type"].shift(), "")

或者按照其他答案的建议,您可以使用diff

df["time"].diff().where(df["type"] == df["type"].shift(), "")

答案 1 :(得分:0)

我的方法是使用pandas.apply()

type_prev = ''
time_prev = 0

def lambda_func(row):
    global type_prev
    global time_prev
    if row['type'] == time_prev:
        time_diff = row['time'] - time_prev
    else:
        time_diff = ''
    time_prev = row['time']
    type_prev = row['type']
    return time_diff

df['delta'] = df.apply(lambda_func)

答案 2 :(得分:0)

您应该使用向量化方法。例如,您可以将numpy.wherepd.Series.shiftpd.Series.diff结合使用:

df['C_id'] = np.where(df['type'] == df['type'].shift(), df['time'].diff(), np.nan)

请注意,我强烈建议您不要使用空字符串''作为替代值,因为这将迫使您的系列具有object dtype而不是{{1 }}。

相关问题