我想在某个条件下计算数据帧中的增量时间,所以我写了一个循环:
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
(我不理解)。进行这种计算的最佳方法是什么?
答案 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.where
与pd.Series.shift
和pd.Series.diff
结合使用:
df['C_id'] = np.where(df['type'] == df['type'].shift(), df['time'].diff(), np.nan)
请注意,我强烈建议您不要使用空字符串''
作为替代值,因为这将迫使您的系列具有object
dtype而不是{{1 }}。