【问题标题】:Random sampling pandas based on column values基于列值的随机抽样 pandas
【发布时间】:2017-09-03 22:16:58
【问题描述】:

我有文件(A、B、C 等),每个文件都有 12,000 个数据点。我已将文件分成 1000 个点的批次并计算每个批次的值。所以现在对于每个文件,我们有 12 个值,它们被加载到 pandas 数据框中(如下所示)。

    file    value_1     value_2
0   A           1           43
1   A           1           89
2   A           1           22
3   A           1           87
4   A           1           43
5   A           1           89
6   A           1           22
7   A           1           87
8   A           1           43
9   A           1           89
10  A           1           22
11  A           1           87
12  A           1           83
13  B           0           99
14  B           0           23
15  B           0           29
16  B           0           34
17  B           0           99
18  B           0           23
19  B           0           29
20  B           0           34
21  B           0           99
22  B           0           23
23  B           0           29
24  B           0           34
25  C           1           62
-   -           -           -
-   -           -           -

现在作为下一步,我需要随机选择一个文件,并为该文件随机选择 4 个批次作为 value_1 的序列。后者,我相信可以用 df.sample() 来完成,但我不确定如何随机选择文件。我试图让它与 np.random.choice(data['file'].unique()) 一起工作,但似乎不正确。

提前感谢您的帮助。总的来说,我对 pandas 和 python 还很陌生。

【问题讨论】:

  • 您的文件是数据框列表?
  • 我的原始文件是 ascii (.mat) 文件。我从批次中提取值并将其保存到与上述类似的 pandas 数据帧中。
  • 试试data[data.file == np.random.choice(data['file'].unique())].sample(n=4)。如果这不能为您提供所需的输出,请编辑问题以添加您的预期输出。
  • 谢谢。但所需的输出应该是 4 个批次的随机序列。序列的起点将是随机的,但值将是 4 个连续批次。我会更新这个问题,谢谢你的建议。
  • 把所有的df存入一个list,得到随机数,选择df。

标签: python pandas sampling


【解决方案1】:

如果我理解您想要了解的内容,以下内容应该会有所帮助:

# Test dataframe
import numpy as np
import pandas as pd


data = pd.DataFrame({'file': np.repeat(['A', 'B', 'C'], 12),
                     'value_1': np.repeat([1,0,1],12),
                     'value_2': np.random.randint(20, 100, 36)})
# Select a file
data1 = data[data.file == np.random.choice(data['file'].unique())].reset_index(drop=True)

# Get a random index from data1
start_ix = np.random.choice(data1.index[:-3])

# Get a sequence starting at the random index from the previous step
print(data.loc[start_ix:start_ix+3])

【讨论】:

  • 这正是我所需要的。一个小问题是我得到了 data.loc[start_ix:start_ix+3] 的 KeyError。
  • @RnK,遇到KeyError异常时start_ix的值是多少。我刚刚在与您的问题类似的示例数据帧上测试了 2000 次,但我没有得到KeyError 异常。
  • @RnK 在使用.loc 之前尝试重置data1 的索引。如果这不起作用,请确保在您的问题中添加您正在使用的数据。我添加了我正在使用的数据框。
  • 抱歉是我的错误,因为我没有重置索引。感谢您的帮助。
【解决方案2】:

这是一个相当冗长的答案,它具有很大的灵活性,并使用了我生成的一些随机数据。我还在dataframe 中添加了一个字段来表示该行是否已被使用。

生成数据

import pandas as pd
from string import ascii_lowercase
import random

random.seed(44)

files = [ascii_lowercase[i] for i in range(4)]
value_1 = random.sample(range(1, 10), 8)

files_df = files*len(value_1)
value_1_df = value_1*len(files)
value_1_df.sort()
value_2_df = random.sample(range(100, 200), len(files_df))

df = pd.DataFrame({'file' : files_df,
                 'value_1': value_1_df,
                 'value_2': value_2_df,
                  'used': 0})

随机选择文件

len_to_run = 3 #change to run for however long you'd like
batch_to_pull = 4
updated_files = df.loc[df.used==0,'file'].unique()

for i in range(len_to_run): #not needed if you only want to run once
    file_to_pull = ''.join(random.sample(updated_files, 1))
    print 'file ' + file_to_pull
    for j in range(batch_to_pull): #pulling 4 values
        updated_value_1 = df.loc[(df.used==0) & (df.file==file_to_pull),'value_1'].unique()
        value_1_to_pull = random.sample(updated_value_1,1)
        print 'value_1 ' + str(value_1_to_pull)
        df.loc[(df.file == file_to_pull) & (df.value_1==value_1_to_pull),'used']=1

file a
value_1 [1]
value_1 [7]
value_1 [5]
value_1 [4]
file d
value_1 [3]
value_1 [2]
value_1 [1]
value_1 [5]
file d
value_1 [7]
value_1 [4]
value_1 [6]
value_1 [9]

【讨论】:

  • 感谢您的帮助。这将在以后编写独立函数时很有用。
猜你喜欢
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2020-09-19
相关资源
最近更新 更多