Как случайным образом выбрать элементы из подмножества данных? - PullRequest
0 голосов
/ 04 июня 2018

У меня есть фрейм данных в следующей форме:

W1 W2 W3 W4 0 1 1 0 1 1 1 1 1 0 0 0 0 1 0 1

Для каждой строки я хочу случайным образом выбрать один элемент 1 и создать другиенуль.Начальные нули остаются нулями Например,

W1 W2 W3 W4 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1

У меня очень замысловатое решение, использующее iterrows(), но я ищу пандастическое решение.

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

IIUC, вы хотите случайным образом выбрать 1 из каждой строки и сделать оставшиеся 0. Вот один из подходов.Пример индексов и на основе индексов присваивают 1. т.е.

idx = pd.DataFrame(np.stack(np.where(df==1))).T.groupby(0).apply(lambda x: x.sample(1)).values
# array([[0, 2],
#        [1, 1],
#        [2, 0],
#        [3, 3]])

ndf = pd.DataFrame(np.zeros(df.shape),columns=df.columns)

ndf.values[idx[:,0],idx[:,1]] = 1

   W1  W2  W3  W4
0   0   0   1   0
1   1   0   0   0
2   1   0   0   0
3   0   1   0   0
0 голосов
/ 05 июня 2018

Вот смесь функционального и пандастического подхода:

df = pd.DataFrame({'w1': [0, 1,1,0],
                   'w2': [1, 1,0,1],
                   'w3': [1, 1,0,0],
                   'w4': [0, 1,0,1]})
df
   w1  w2  w3  w4
0   0   1   1   0
1   1   1   1   1
2   1   0   0   0
3   0   1   0   1


def choose_one(row):
    """
    returns array with randomly chosen positive value and 0 otherwise
    """
    one = np.random.choice([i for i, v in enumerate(row) if v])
    return [0 if i != one else 1 for i in range(len(row))]

применяется для каждого ряда

df.apply(choose_one, 1)

   w1  w2  w3  w4
0   0   1   0   0
1   0   1   0   0
2   1   0   0   0
3   0   0   0   1
0 голосов
/ 04 июня 2018

Идея состоит в том, чтобы извлекать позиции, перетасовывать и затем удалять дубликаты по первому столбцу 0 - по строкам:

#get positions of 1
a = np.where(df == 1)

#create nd array
X = np.hstack((a[0][:, None], a[1][:, None]))
#shuffling
np.random.shuffle(X)

#remove duplicates
vals = pd.DataFrame(X).drop_duplicates(0).values

#set 1
arr = np.zeros(df.shape)
arr[vals[:,0],vals[:,1]] = 1

df = pd.DataFrame(arr.astype(int), columns=df.columns, index=df.index)
print (df)
   W1  W2  W3  W4
0   0   0   1   0
1   0   0   0   1
2   1   0   0   0
3   0   1   0   0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...