Pandas基于diff列形成集群

时间:2014-09-18 22:42:20

标签: python pandas

我正在尝试使用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))

enter image description here

所以我需要做的是检查每个具有彼此在2秒内发生的时间值的组,选择Coef中具有最高值的组并丢弃其余组。所以在这个例子中,我会以某种方式将索引0和1组合在一起并丢弃索引0(因为df.Coef [0]< df.Coef 1)。

同样,索引5,6和7将被分组,除了索引6之外的所有索引都被丢弃。所以所需的输出是df.drop([0,5,7]):

enter image description here

我目前有一个python while循环算法来执行此操作,但数据框可以包含数百万个指标,因此它太慢了。任何纯粹的熊猫解决方案都将非常感激

1 个答案:

答案 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