随机采样数据帧的行,直到达到所需的列总和

时间:2017-04-20 02:21:31

标签: python-2.7 pandas

我有一个这样的数据框:

ID  key   acres
1   156   10
2   157   60
3   158   50
4   159   1
5   160   9
6   161   110

我希望随机选择行,直到每个采样行中所选acres的总和达到150,或尽可能接近150。我想存储“ID'所有选中的行。

我目前正在尝试这样做:

acres = 0
obid = []
while acres <= 150:
     rows = random.sample(df.index, 1)
     sample= df.ix[rows]
     acres = acres + sample['acres']
     obid.append(sample['ID'])
     df= df.drop(rows)

但这种方法存在一些问题。首先,由于我在循环中删除了样本,并且实际上没有更改原始df,因此可能会对相同的行进行两次采样。其次,我收到了这个错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

这让我相信完全有更好的方法。

1 个答案:

答案 0 :(得分:1)

让我们尝试这样的事情:

  • sample从数据框中提取示例行,参数frac=1状态获得100%的权限 行。这基本上改变了数据帧。

  • 使用iterrrows遍历洗牌后的数据框。

代码:

acres = 0
obid = []
for i in df.sample(frac=1).iterrows():
    if (acres + i[1]['acres']) <= 150:
        acres += i[1]['acres']
        obid.append(i[1]['ID'])

print(obid) 

输出:

[5, 6, 4, 1]

让我们看看带有结果的原始数据框

 print(df[df['ID'].isin(obid)])

输出:

   ID  key  acres
0   1  156     10
3   4  159      1
4   5  160      9
5   6  161    110