gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:32:28 25 4
gpt4 key购买 nike

我有关于机器故障的数据。数据位于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com