Выберите случайные значения из фрейма данных так, чтобы результирующий фрейм данных был уникальным в пределах двух столбцов в python-pandas - PullRequest
1 голос
/ 03 октября 2019

Рассмотрим фрейм данных:

data = [['G1','P1',0.3], ['G1','P2',0.3], ['G1','P3',0.3],['G2','P1',0.3],['G2','P2',0.3],['G3','P2',0.3]] 
df2 = pd.DataFrame(data, columns = ['GT', 'PRED','ACC']) 

df2 выглядит следующим образом:

    GT  PRED    ACC
0   G1  P1      0.3
1   G1  P2      0.3
2   G1  P3      0.3
3   G2  P1      0.3
4   G2  P2      0.3
5   G3  P2      0.3

Цель состоит в том, чтобы выбрать случайные строки, чтобы значения в GT и PRED выбирались однозначно. Из других поисков переполнения стека у меня есть следующий код:

size = 1        # sample size
replace = False # with replacement
fn = lambda obj: obj.loc[np.random.choice(obj.index, size, replace),:]
pt = df2.groupby('PRED', as_index=False).apply(fn)

, чей вывод

    GT  PRED    ACC
0   G1  P1      0.3
1   G1  P2      0.3
2   G1  P3      0.3

Мой ожидаемый вывод должен быть

    GT  PRED    ACC
0   G1  P3      0.3
1   G2  P1      0.3
2   G3  P2      0.3

То есть ввремя фильтрации мы гарантируем, что GT и PRED уникальны. Я могу убедиться в этом, применив функцию после генерации df в цикле for. Я хотел избежать этого.

1 Ответ

1 голос
/ 03 октября 2019

Это может быть способ.

  1. Создание массивов с уникальными значениями столбцов 'GT' и 'PRED'. Их можно получить, используя уникальный метод.
  2. Используйте numpy shuffle , чтобы перетасовать каждый массив (это даст вам случайность).
  3. Создайте кадр данных pairs, используя перемешанные массивы. Каждая строка этого массива будет парой случайно выбранных 'GT' и 'PRED' уникальных значений.
  4. С пандами apply и некоторой логической логикой, найдите, какие строки в df2 имеют действительные 'GT' и 'PRED' пара, т. е. пара, которая присутствует в pairs кадре данных.
  5. Выберите эти строки только из df2, чтобы получить выходные данные.

Переведено врабочий код, это:

gt_u = df2['GT'].unique()
pred_u = df2['PRED'].unique()

np.random.shuffle(gt_u)
np.random.shuffle(pred_u)

pairs = pd.DataFrame({'GT':gt_u, 'PRED':pred_u})    
#pairs = pd.DataFrame([[x, y] for x, y in zip(gt_u, pred_u)], columns=['GT', 'PRED'])

sel = df2.apply(lambda x : (x[['GT', 'PRED']] == pairs).all(axis=1).any(axis=0), axis=1)
out = df2.loc[sel]

Примечание: если вы не уверены, что уникальные массивы будут одинаковой длины, используйте закомментированную строку для генерации pairs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...