如何从DataFrame中随机选择记录?

时间:2019-02-13 18:04:23

标签: python pandas

我有以下名为y的单列pandas DataFrame。该列称为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条记录。

下面我提供了我的代码。但是,此代码始终选择每个类别的第一 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

4 个答案:

答案 0 :(得分:4)

groupby()df.sample()一起使用:

n=4
df.groupby('Y').apply(lambda x: x.sample(n)).reset_index(drop=True)

    Y
0   0
1   0
2   0
3   0
4   1
5   1
6   1
7   1
8   2
9   2
10  2
11  2

编辑,用于索引:

df.groupby('Y').apply(lambda x: x.sample(n)).reset_index(1).\
    rename(columns={'level_1':'indices'}).reset_index(drop=True).groupby('Y')['indices'].\
                                                    apply(list).reset_index()

   Y          indices
0  0   [4, 1, 17, 16]
1  1    [0, 6, 10, 5]
2  2  [13, 14, 7, 11]

答案 1 :(得分:4)

使用

idx0,idx1,idx2=[ np.random.choice(y.index.values,4,replace=False).tolist()for _, y in df.groupby('0')]
idx0
Out[48]: [1, 2, 16, 8]

更多信息

s=pd.Series([1,0,1,0,2],index=[1,3,4,5,9])
idx=[1,4] # both anky and mine answer return the index
s.loc[idx] # using .loc with index is correct 
Out[59]: 
1    1
4    1
dtype: int64
s.values[idx]# using value with slice with index, is wrong
Out[60]: array([0, 2], dtype=int64)

答案 2 :(得分:1)

假设列“ y”属于数据框“ df”,并且您要选择N = 4个随机行:

for i in np.unique(df.y).astype(int):
    print(df.y[np.random.choice(np.where(df.y==np.unique(df.y)[i])[0],4)])

您将获得:

10116    0
329      0
4709     0
5630     0
Name: y, dtype: int32
382     1
392     1
9124    1
383     1
Name: y, dtype: int32
221      2
443      2
4235     2
5322     2
Name: y, dtype: int32

已编辑,以获取索引:

pd.concat([df.y[np.random.choice(np.where(df.y==np.unique(df.y)[i])[0],4)] for i in np.unique(df.y).astype(int)],axis=0)

您将获得:

10116    0
329      0
4709     0
5630     0
382      1
392      1
9124     1
383      1
221      2
443      2
4235     2
5322     2
Name: y, dtype: int32

要获取嵌套的索引列表:

[df.holiday[np.random.choice(np.where(df.holiday==np.unique(df.holiday)[i])[0],4)].index.tolist() for i in np.unique(df.holiday).astype(int)]

您将获得:

[[10116,329,4709,5630],[382,392,9124,383],[221,443,4235,5322]]

答案 3 :(得分:-1)

N = 4
y.loc[y[0]==0].sample(N)
y.loc[y[0]==1].sample(N)
y.loc[y[0]==2].sample(N)