首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫元素循环

熊猫元素循环
EN

Stack Overflow用户
提问于 2018-07-03 08:35:53
回答 3查看 68关注 0票数 1

我想在一个dataframe中计算增量时间(有一些条件),所以我编写了一个循环:

代码语言:javascript
复制
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 (我不明白)。做这样的计算最好的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-03 08:54:36

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

代码语言:javascript
复制
df['C_id'] = np.where(df['type'] == df['type'].shift(), df['time'].diff(), np.nan)

注意,我强烈建议您使用而不是,使用空字符串''作为您的替代值,因为这将迫使您的系列使用object dtype而不是float

票数 0
EN

Stack Overflow用户

发布于 2018-07-03 08:55:07

为此,我将使用.shift()。因此,如果我们没有条件,您只需要df["time"] - df["time"].shift(),但是当您想要添加条件时,where会有所帮助。所以这里有一个单行的解决方案

代码语言:javascript
复制
(df["time"] - df["time"].shift()).where(df["type"] == df["type"].shift(), "")

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

代码语言:javascript
复制
df["time"].diff().where(df["type"] == df["type"].shift(), "")
票数 1
EN

Stack Overflow用户

发布于 2018-07-03 08:43:44

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

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51150059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档