我想在一个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 (我不明白)。做这样的计算最好的方法是什么?
发布于 2018-07-03 08:54:36
你应该用矢量化的方法。例如,您可以将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而不是float。
发布于 2018-07-03 08:55:07
为此,我将使用.shift()。因此,如果我们没有条件,您只需要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(), "")发布于 2018-07-03 08:43:44
我的方法是使用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)https://stackoverflow.com/questions/51150059
复制相似问题