我很难从数据框中随机选择行。通常,使用np.random.choice(data,size=1000)
选择一行不是问题。我认为替换= True。但是,我需要随机选择一个小时并作为输出,接收每个季度的4行。
要选择的数据框如下(1132行):
data=
Price Consume Feed
StartTime
2018-07-04 02:00:00 45.80 67.91 67.91
2018-07-04 02:15:00 45.80 51.05 51.05
2018-07-04 02:30:00 45.80 46.12 46.12
2018-07-04 02:45:00 45.80 46.86 46.86
2018-07-11 05:00:00 43.80 43.49 43.49
2018-07-11 05:15:00 43.80 50.71 50.71
2018-07-11 05:30:00 43.80 48.19 48.19
2018-07-11 05:45:00 43.80 40.02 40.02
我想要的输出是这样的:
假设随机生成器已“选择” 2018-07-11 05:00:00
,则输出将为
2018-07-11 05:00:00 43.80 43.49 43.49
2018-07-11 05:15:00 43.80 50.71 50.71
2018-07-11 05:30:00 43.80 48.19 48.19
2018-07-11 05:45:00 43.80 40.02 40.02
根据随机样本的数量(N),结果数据帧的长度应为4xN。
是否可以直接从数据框中随机选择一天的时间并重复1000次?恐怕使用额外的数据框来选择一个小时,然后在原始数据框中查找相应的值会非常耗时。 我相信这在Python中应该可行,但是我找不到任何提示。
感谢您的帮助!
答案 0 :(得分:3)
我认为您将值与DatetimeIndex.floor
进行比较以删除分钟和秒:
N = 1000
vals = pd.to_datetime(np.random.choice(df.index,size=N)).floor('H')
hours = df.index.floor('H')
for i in vals:
print (df[hours == i])
编辑:要加入所有小型DataFrame,请使用concat
:
df1 = pd.concat([df[hours == i] for i in vals])
或使用np.concatenate
中的DatetimeIndex
创建数组,然后按loc
进行选择:
idx = np.concatenate([df.index[hours == i] for i in vals])
df1 = df.loc[idx]
答案 1 :(得分:1)
采样一次以获取随机索引,然后查找该日期和小时的所有匹配项:
random_idx = df.sample().index
df[(df.index.date == random_idx.date) & (list(df.index.hour) == random_idx.hour)]
然后执行1000次:
for i in range(1000):
random_idx = df.sample().index
print(df[(df.index.date == random_idx.date) & (list(df.index.hour) == random_idx.hour)])