在大熊猫身上连续发生两次事件



每当连续发生两个事件时,我都会尝试获取数据的子集。该事件带有时间戳。所以每次有连续的2,然后有连续的3,我想把它子集到一个数据帧中,并把它附加到一个字典中。下面的代码做到了这一点,但我必须将其应用于超过2000万obs的非常大的数据帧。使用iterrows时速度非常慢。我怎么能这么快?

df = pd.DataFrame({'Date': [101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122],
'Event': [1,1,2,2,2,3,3,1,3,2,2,3,1,2,3,2,3,2,2,3,3,3]})
dfb = pd.DataFrame(columns = df.columns)
C = {}
f1 = 0
for index, row in df.iterrows():
if ((row['Event'] == 2) & (3 not in dfb['Event'].values)):
dfb = dfb.append(row)
f1 =1
elif ((row['Event'] == 3) & (f1 == 1)):
dfb = dfb.append(row)
elif 3 in dfb['Event'].values:
f1 = 0
C[str(dfb.iloc[0,0])] = dfb
del dfb
dfb = pd.DataFrame(columns = df.columns)
if row['Event'] == 2:
dfb = dfb.append(row)
f1 =1
else:
f1=0
del dfb
dfb = pd.DataFrame(columns = df.columns)

编辑:所需的输出基本上是i中所示子集的字典magehttps://i.stack.imgur.com/ClWZs.png

  1. 如果你想加速,你应该向量化你的代码。您可以这样尝试(df与您的代码相同(:
vec = df.copy()
vec['Event_y'] = vec['Event'].shift(1).fillna(0).astype(int)
vec['Same_Flag'] = float('nan')
vec.Same_Flag.loc[(vec['Event_y'] == vec['Event']) & (vec['Event'] != 1)] = 1
vec.dropna(inplace=True)
vec.loc[:, ('Date', 'Event')]

输出为:

日期事件
3 104 2
4 105 2
6 107 3
10 111 2
18 119 2
20 121 3
21 122 3

我认为这接近您的需求。你可以在此基础上改进。

  1. 我不明白为什么不计算日期104, 105, 107

最新更新