我有一个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轴。
答案 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
以始终拥有相同的随机样本。
我相信这就是你要求的。