非比例随机样本

时间:2017-07-11 08:33:33

标签: python pandas numpy

我有一个pandas dataframe,例如:

deviceID    timestamp   time_since_previous_timestamp
A           3           NaN            
A           14          11            
A           127         113
A           133         6              
# 7k other data points for deviceID = A                                  
B           1           NaN 
B           12          11
# 1.5k other datapoints for deviceID = B                                  
C           42          NaN
C           48          6
# 600 other data points for deviceID = C

依此类推,基本上我无法控制每个deviceID的数据点数,而且它可能会有很大差异。

为了绘制一些东西而没有我的情节因某些deviceID比其他人有更多的数据点而被扭曲的东西,我想到了我的数据帧的随机样本,其目的是获得大致相同的数量来自每个deviceID的数据点(即:我的样本将有约400行deviceID = A,〜400行deviceID = B,〜400 deviceID = C,等等)

我该怎么做? (使用pandas和/或numpy和/或两者都没有。

编辑:我正在绘制的内容:

首先,我在time_since_previous_timestamp进行分组并计算:

time_since_previous_timestamp         count
NaN                                   3
6                                     2
11                                    2
113                                   1

然后将count绘制为y轴,将time_since_previous_timestamp绘制为x轴。

1 个答案:

答案 0 :(得分:1)

您可以使用pandas.DataFrame.sample指定n=400并结合pandas.DataFrame.loc,然后使用pandas.concat连接所有部分,如下所示:

df = pd.concat([df.loc[df.ID == 'A'].sample(n=400),df.loc[df.ID == 'B'].sample(n=400),df.loc[df.ID == 'C'].sample(n=400)])

示例测试:

#df:
#    B ID
#0  10  A
#1   9  A
#2   8  A
#3   7  A
#4   6  B
#5   5  B
#6   4  B
#7   3  C
#8   2  C
#9   1  C

df = pd.concat([df.loc[df.ID == 'A'].sample(n=2),df.loc[df.ID == 'B'].sample(n=2),df.loc[df.ID == 'C'].sample(n=2)])

输出:

    B ID
0  10  A
3   7  A
6   4  B
5   5  B
8   2  C
7   3  C

您还可以修复random_state以始终拥有相同的随机样本。

我相信这就是你要求的。