Pandas:基于列值条件随机抽取5组连续5行数据
解决方案
要实现随机抽取5组同一AGENT下连续5天的时间序列数据,可按以下步骤操作:
1. 先确保数据按AGENT和时间排序
时间序列的"连续"必须基于时间顺序,所以第一步要把数据按AGENT分组后再按时间列排序(假设你的时间列名为DATE,请根据实际字段名修改):
import pandas as pd import numpy as np # 按AGENT和时间排序,重置索引保证连续行的顺序正确 df_sorted = df.sort_values(["AGENT", "DATE"]).reset_index(drop=True)
2. 随机选择AGENT并抽取连续片段
因为你需要5组数据(允许重复抽取同一AGENT的不同连续段,对应原代码的replace=True),可以先随机选5个AGENT样本,再对每个AGENT随机抽取一段连续5天的数据:
# 随机挑选5个AGENT(允许重复选中同一AGENT) selected_agents = np.random.choice(df_sorted["AGENT"].unique(), size=5, replace=True) final_samples = [] for agent in selected_agents: # 获取当前AGENT的所有数据 agent_group = df_sorted[df_sorted["AGENT"] == agent] # 如果该AGENT的数据不足5天,直接跳过(也可根据需求自行调整处理逻辑) if len(agent_group) < 5: continue # 计算可抽取的起始索引范围 max_start_idx = len(agent_group) - 5 # 随机选一个起始点 start_idx = np.random.randint(0, max_start_idx + 1) # 抽取连续5行数据 consecutive_chunk = agent_group.iloc[start_idx:start_idx+5] final_samples.append(consecutive_chunk) # 合并所有抽取的片段,得到最终结果 result_df = pd.concat(final_samples, ignore_index=True)
补充:批量处理每个AGENT的场景
如果需要给每个AGENT固定抽取多个连续段(比如每个AGENT抽2组,再从中筛选出总共5组),可以改用groupby.apply批量处理:
def get_consecutive_chunks(group, n_chunks=1, window=5): if len(group) < window: return pd.DataFrame() max_start = len(group) - window # 随机选n_chunks个起始点,允许重复抽取同一AGENT的同一段 starts = np.random.choice(range(max_start + 1), size=n_chunks, replace=True) return pd.concat([group.iloc[s:s+window] for s in starts], ignore_index=True) # 每个AGENT抽2组连续片段 all_chunks = df_sorted.groupby("AGENT").apply(get_consecutive_chunks, n_chunks=2).reset_index(drop=True) # 从所有片段中取前5组 result_df = all_chunks.head(5).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者CodingNewbie
相关产品推荐
相关产品推荐

