выборочные значения до получения всех уникальных значений - PullRequest
0 голосов
/ 14 января 2019

У меня есть кадр данных pandas, и я хочу сэмплировать значения по весам, и я знаю, что есть функция df.sample.

Но проблема, которая мне нужна, состоит в том, чтобы получить образец, содержащий N уникальных элементов в одном из столбцов данных

Может кто-нибудь сделать что-то подобное?

1010 * редактировать *

пример:

У меня есть датафрейм с 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 разных значения, но размер выборки больше

изменить еще раз

Мне нужно сделать выборку данных, пока у меня не будет N разных значений в 1 столбце

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Я думаю, вам нужно DataFrame.drop_duplicates с DataFrame.sample, а затем отфильтровать по isin с boolean indexing первым и затем примените это решение :

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
0 голосов
/ 14 января 2019

Вы можете подойти к этому по-другому, вы можете перетасовать порядок данных на

df = df.sample(len(df)) 

, а затем отбрасывает дубликат из столбца, из которого вам нужен уникальный, на

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

, что оставит вам по одной строке для каждого значения, вы получите случайную выборку, перетасовав df, как я делал раньше.

...