Python(Pandas)在指定条件内更新前x行

2024-09-20 22:23:19 发布

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

我有机器故障的数据。数据位于具有dateidfailureprevious_30_days列的数据帧中。previous_30_days列当前为全零。我期望的结果是,如果在失败前30天内发生,则用“1”填充previous_30_days列中的行。我目前可以使用以下代码执行此操作:

failure_df = df[(df['failure'] == 1)] # create a dataframe of just failures

for index, row in failure_df.iterrows():
    df.loc[(df['date'] >= (row.date - datetime.timedelta(days=30))) &
           (df['date'] <= row.date) & (df['id'] == row.id), 'previous_30_days'] = 1

注意,我还检查了id匹配,因为日期在dataframe中是重复的,所以我不能简单地假设它是前30行。你知道吗

我的代码可以工作,但问题是数据帧有数百万行,而这段代码目前速度太慢。你知道吗

有没有更有效的方法来达到预期的结果?如有任何想法,我们将不胜感激。你知道吗


Tags: of数据代码机器iddataframedfdate
1条回答
网友
1楼 · 发布于 2024-09-20 22:23:19

我对您的代码如何工作(或者应该如何工作)有点困惑,但是这应该会为您指明正确的方向,并且可以很容易地进行调整。通过避免iterrows而支持向量化操作,它将更快(对于这个小数据帧,它将比大数据帧快7倍左右,这应该是一个更大的改进)。你知道吗

np.random.seed(123)
df=pd.DataFrame({ 'date':np.random.choice(pd.date_range('2015-1-1',periods=300),20), 
                  'id':np.random.randint(1,4,20) })
df=df.sort(['id','date'])

现在,计算当前日期和上一日期之间的天数(按id)。你知道吗

df['since_last'] = df.groupby('id')['date'].apply( lambda x: x - x.shift() )

然后根据到上一个日期的天数创建新列。你知道吗

df['previous_30_days'] = df['since_last'] < datetime.timedelta(days=30)

         date  id  since_last previous_30_days
12 2015-02-17   1         NaT            False
6  2015-02-27   1     10 days             True
3  2015-03-25   1     26 days             True
0  2015-04-09   1     15 days             True
10 2015-04-24   1     15 days             True
5  2015-05-04   1     10 days             True
11 2015-05-07   1      3 days             True
8  2015-08-14   1     99 days            False
14 2015-02-02   2         NaT            False
9  2015-04-07   2     64 days            False
19 2015-07-28   2    112 days            False
7  2015-08-03   2      6 days             True
15 2015-08-13   2     10 days             True
1  2015-08-19   2      6 days             True
2  2015-01-18   3         NaT            False
13 2015-03-15   3     56 days            False
18 2015-04-07   3     23 days             True
4  2015-04-17   3     10 days             True
16 2015-04-22   3      5 days             True
17 2015-09-11   3    142 days            False

相关问题 更多 >

    热门问题