我正在尝试使用Pandas根据表示时间(以秒为单位)的列的差异来消除数据框中的一些近似重复项。例如:
import pandas as pd, numpy as np
df=pd.DataFrame([1200,1201,1233,1555,1650,5561,5562],columns=['Time'])
df['Dif']=df.Time.diff()
df['Coef']=np.random.rand(len(df))
所以我需要做的是检查每个具有彼此在2秒内发生的时间值的组,选择Coef中具有最高值的组并丢弃其余组。所以在这个例子中,我会以某种方式将索引0和1组合在一起并丢弃索引0(因为df.Coef [0]< df.Coef 1)。
同样,索引5,6和7将被分组,除了索引6之外的所有索引都被丢弃。所以所需的输出是df.drop([0,5,7]):
我目前有一个python while循环算法来执行此操作,但数据框可以包含数百万个指标,因此它太慢了。任何纯粹的熊猫解决方案都将非常感激
答案 0 :(得分:4)
您可以通过枚举组来进行分组:
In [11]: (df['Time'].diff() > 2).cumsum()
Out[11]:
0 0
1 0
2 1
3 2
4 3
5 4
6 4
Name: Time, dtype: int64
注意:如果这是一个日期时间列而不是2,那么您需要与timedelta进行比较。
In [12]: g = df.groupby((df.Time.diff() > 2).cumsum())
现在,您可以在每个组的Coeff列中使用idxmax(具有最大元素的索引):
In [13]: g.Coef.idxmax()
Out[13]:
Time
0 1
1 2
2 3
3 4
4 5
Name: Coef, dtype: int64
并选择以下行:
In [14]: df.loc[g.Coef.idxmax()] # results will vary since we've used a random df
Out[14]:
Time Dif Coef
1 1201 1 0.760751
2 1233 32 0.501199
3 1555 322 0.473628
4 1650 95 0.371059
5 5561 3911 0.917556