使用来自 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)
我有一个包含 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)