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

标签 python pandas

我有关于机器故障的数据。数据位于 pandas 数据框中,其中包含 dateidfailureprevious_30_days 列。 previous_30_days 列当前全为零。我期望的结果是,如果 previous_30_days 列中的行发生在故障发生前的 30 天时间范围内,则用“1”填充这些行。我目前可以使用以下代码来做到这一点:

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 匹配,因为日期在数据框中重复,所以我不能假设它只是前 30 行。

我的代码可以工作,但问题是数据帧有数百万行,而这个代码目前太慢了。

有没有更有效的方法来达到预期的结果?任何想法将不胜感激。

最佳答案

我对您的代码如何工作(或应该如何工作)有点困惑,但这应该为您指明正确的方向并且可以轻松调整。通过避免 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

关于Python(Pandas)在指定条件下更新前 x 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31701732/

相关文章:

Python:gettext 不会在 Windows 上加载翻译

python - 无需应用程序即可访问 Twitter Streaming API

python - 子集 pandas 数据帧以根据另一个数据帧中的值获取特定行数

python - 如何在 Panda 中计算两个数据框的矩阵乘积?

python - 用kde绘制 Pandas 直方图?

python - 使用先前值填充日期时间之间的重新采样间隙(多索引)

Python QueryFrame 返回 None,但 C++ 绑定(bind)有效

python - Quamash 和 PyQt5 - 进程结束时出现额外窗口

python - 如何在字符级别对句子进行单热编码?

python - 如何在 seaborn lmplot 上添加标题?