【发布时间】:2019-02-14 04:49:05
【问题描述】:
我有以下单列 pandas DataFrame,名为 y。该列称为0(零)。
y =
1
0
0
1
0
1
1
2
0
1
1
2
2
2
2
1
0
0
我想为每个 y 值选择 N 行记录索引。在上面的例子中,0 有 6 条记录,1 有 7 条记录,2 有 5 条记录。
我需要从这 3 个组中的每一个中选择 4 条记录。
下面我提供我的代码。但是,此代码始终选择每个类的 first N(例如 4)条记录。我需要在整个数据集上随机进行选择。
我该怎么做?
idx0 = []
idx1 = []
idx2 = []
for i in range(0, len(y[0])):
if y[0].iloc[i]==0 and len(idx0)<=4:
idx0.append(i)
if y[0].iloc[i]==1 and len(idx1)<=4:
idx1.append(i)
if y[0].iloc[i]==2 and len(idx2)<=4:
idx2.append(i)
更新:
预期结果是索引列表,而不是过滤后的 DataFrame y。
n = 4
a = y.groupby(0).apply(lambda x: x.sample(n)).reset_index(1).\
rename(columns={'level_1':'indices'}).reset_index(drop=True).groupby(0)['indices'].\
apply(list).reset_index()
class = 0
idx = a.ix[2].tolist()[class]
y.values[idx] # THIS RETURNS WRONG WRONG CLASSES IN SOME CASES
0
1. # <- WRONG
0
0
【问题讨论】:
-
为什么需要索引,而不是随机样本?
-
@ALollz:我需要在我的代码中使用它作为参考。
-
嗯,是的,我只是不知道您是否需要它来重新索引或执行一些可以使用
.sample一次性完成的计算。此外,如果一个组的行数少于N行(如上例中的 3),您应该只获取 3 的索引,还是希望最多替换 4 个元素进行采样? -
@ALollz:这个问题可以忽略。 N 总是大于每个类的记录数。