从数据中获取特定中位数

时间:2013-05-22 17:15:41

标签: python pandas max

我有DataFrame个列timelatitudelongitude。它看起来像这样:

>>> df.head()
                  time   latitude  longitude
0  2011-12-16 08:09:07  42.386391 -71.013544
1  2011-12-16 08:09:08  42.386391 -71.013544
2  2011-12-16 08:09:09  42.386391 -71.013544
3  2011-12-16 08:09:10  42.386391 -71.013544
4  2011-12-16 08:09:11  42.386391 -71.013544

我想做的是估计一个人住在哪里。最简单的方法是在当天最早的时刻获取其位置的模式(最常见)。

我的数据框有超过700,000行,跨越大约3个月,每秒4-8小时的数据!所以我需要做的是从每天的前几秒中找到最常见的(纬度,经度)对。

如果我想使用整个数据集而不是每天的前几秒,我可以执行以下操作:

l = []
for i in range(len(df)-1):
    l.append((df.latitude[i],df.longitude[i]))
import collections
answer = collections.Counter(l).most_common(1)

这可能是也可能不是最有效的方式,如果你有更好的工作方式,请随意在答案中使用。这一点的重要部分是我从每天获取前几个值。

谢谢。

注意:每天的开始时间会有所不同。

2 个答案:

答案 0 :(得分:0)

我认为这会奏效,我在这里使用时间,但同样的想法 然后按日期分组 你的函数返回前3个值的中位数(如果有更少的话,则返回更少)

In [23]: df = DataFrame(randn(2000,2),
        index=date_range('20130101',periods=2000,freq='H'))

In [24]: df
Out[24]: 
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 2000 entries, 2013-01-01 00:00:00 to 2013-03-25 07:00:00
Freq: H
Data columns (total 2 columns):
0    2000  non-null values
1    2000  non-null values
dtypes: float64(2)

In [21]: def f(frame):
   ....:     if len(frame) > 3:
   ....:         frame = frame.iloc[0:4,:]
   ....:     return frame.median()
   ....: 


In [25]: df.resample('D',how=f).head(20)
Out[25]: 
                   0         1
2013-01-01 -1.168960  0.752771
2013-01-02  0.252991  0.257350
2013-01-03  0.823164  0.246403
2013-01-04 -0.253409 -0.099833
2013-01-05  0.328023 -0.308967
2013-01-06 -0.086218 -1.090935
2013-01-07  0.073870  0.256468
2013-01-08 -0.551869  0.332902
2013-01-09  0.267126  0.232623
2013-01-10  0.305948  0.460094
2013-01-11 -0.088975 -1.080070
2013-01-12 -0.587940  0.391419
2013-01-13 -0.220146  0.380210
2013-01-14 -0.689020 -0.873559
2013-01-15  0.576461 -0.184413
2013-01-16  0.258620  0.221407
2013-01-17 -0.385102  0.376829
2013-01-18  0.096542  0.331183
2013-01-19  0.385703  0.241587
2013-01-20 -1.119306 -0.210429

答案 1 :(得分:0)

您可以将中位数的开始日期位置放在一行中。

df.set_index('time').resample('D', how='first').median()

这只考虑每天的第一个位置,而不是前几个位置,但如果每秒采样一次,在我看来,第一个位置和前几个位置可能大致相同。