采样值,直到获得所有唯一值

时间:2019-01-14 09:02:38

标签: pandas dataframe random

我有一个pandas数据框,我想按权重采样值,并且我知道有df.sample函数。

但是我需要的问题是获取一个在数据框列中具有N个唯一元素的示例

任何人都可以做类似的事情吗?

修改

示例:

我有一个包含1列的数据框:

df = pd.DataFrame([1,1,1,2,3,1,2,1,2,1,4,5,2,3,4,4,5,4])

我要采样,并在采样中要获得3个唯一值:

可能的最终结果:

[1,1,1,2,3,2,3]

我对3个不同的值进行采样,但样本量较大

再次编辑

我需要对数据进行采样,直到1列中有N个不同的值

2 个答案:

答案 0 :(得分:0)

您可以用不同的方式来解决这个问题,可以通过

调整数据帧的顺序
df = df.sample(len(df)) 

,然后从您需要的唯一列中删除重复项

df = df.drop_duplicated(subset = "colname") 

这将使您为每个值保留一行,您可以像以前一样通过对df进行混洗来获得随机样本。

答案 1 :(得分:0)

我认为您需要DataFrame.drop_duplicatesDataFrame.sample,然后先用isinboolean indexing过滤,然后再应用this solution

df = pd.DataFrame([1,1,1,2,3,2,3,2,3,1,4,5,3,4,5,2,3,2], columns=['col'])

positions = df['col'].value_counts(normalize=True).to_dict()
print (positions)
{3: 0.2777777777777778, 
 2: 0.2777777777777778, 
 1: 0.2222222222222222, 
 5: 0.1111111111111111, 
 4: 0.1111111111111111}

def sample(obj, replace=False, total=20):
    return obj.sample(n=int(positions[obj.name] * total), replace=replace)

N = 3
v = df["col"].drop_duplicates().sample(n=N)

df1 = df[df['col'].isin(v)].groupby('col', group_keys=False).apply(sample).sort_index()
print (df1)
    col
3     2
4     3
5     2
6     3
7     2
8     3
10    4
12    3
13    4
15    2
16    3
17    2