我有一个这样的数据框:
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().
这让我相信完全有更好的方法。
答案 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