使用来自 pandas 数据帧的随机样本生成输出文件

generate output files with random samples from pandas dataframe

我有一个包含 50 万行的数据框。我需要将 100 组随机选择的行分发给志愿者进行标记。

例如:

df = pd.DataFrame(np.random.randint(0,450,size=(450,1)),columns=list('a'))

我可以删除 100 行的随机样本并输出带有时间戳的文件:

df_subset=df.sample(100)
df_subset.to_csv(time.strftime('%Y%m%d_%H%M%S') + 'dfsample.csv')
df=df.drop(df_subset.index)

以上方法有效,但如果我尝试将其应用于整个示例数据框:

while len(df)>0:
        df_subset=df.sample(100)
        df_subset.to_csv(time.strftime('%Y%m%d_%H%M%S') + 'dfsample.csv')
        df=df.drop(df_subset.index)

它连续运行——我的预期输出是 5 个 timestampdfsample.csv 文件,其中 4 个有 100 行,第五个 50 行都是从 df 中随机选择的,但是 df.drop(df_sample.index) 不更新 df 所以条件是始终为真,它会永远运行生成 csv 文件。我无法解决这个问题。

任何指导将不胜感激

更新

这让我快到了:

for i in range(4):
        df_subset=df.sample(100)
        df=df.drop(df_subset.index)
        time.sleep(1) #added because runs too fast for unique naming
        df_subset.to_csv(time.strftime('%Y%m%d_%H%M%S') + 'dfsample.csv')

它要求我指定文件数量。如果我为示例 df 说 5,我会在 5 日收到错误。我希望有 5 个文件,第 5 个文件有 50 行,但不知道该怎么做。

另一种方法是打乱你的行并摆脱那个糟糕的循环。

df.sample(frac=1)

并保存打乱数据帧的切片。

在 运行 你的代码之后,我认为问题不在于 df.drop 但是包含 time.strftime('%Y%m%d_%H%M%S') + 'dfsample.csv' 的行,因为 Pandas 在一秒钟内创建多个 CSV 文件,这可能会导致一些覆盖问题。

我认为如果你想要使用时间戳的标签文件,也许进入毫秒级别可能更有用并防止覆盖的可能性。你的情况

while len(df)>0:
  df_subset=df.sample(100)
   
  df_subset.to_csv(datetime.now().strftime("%Y%m%d_%H%M%S.%f") + 'dfsample.csv')
  df=df.drop(df_subset.index)