Поменять местами значения внутри классов

Как я могу поменять местами значения внутри классов, пожалуйста?

Как показано в этой таблице:

- - - - - - - - - - До после - - - - - - - - - -

Поменять местами значения внутри классов

Я хочу сделать это, потому что это избыточная выборка данных. Он очень повторяющийся, и это приводит к тому, что инструменты машинного обучения перестают соответствовать друг другу.

Почему вы меняете местами именно эти значения? Есть другие строки class = 3, почему вы решили не редактировать / менять местами ни одну из них?

Thomas Kimber 23.11.2018 11:47

Я хотел бы иметь возможность изменять количество заменяемых значений

R. Cox 23.11.2018 11:56

И вы меняете местами случайным образом значения по строкам для одного столбца, или вы также можете переключить значения по другим столбцам? Может ли быть некоторая корреляция между редактируемым столбцом и другими столбцами в данных, и не рискуете ли вы испортить информацию, рандомизируя ее таким образом? В показанном вами примере замена столбца 1 не имеет никакого значения, поскольку все остальные значения столбца одинаковы в обоих случаях. Таким образом, в этом случае своп не имеет никакого эффекта, кроме существенного изменения порядка строк. Это могло быть просто артефактом вашего примера.

Thomas Kimber 23.11.2018 12:14

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

R. Cox 23.11.2018 13:16

Да, это артефакт моего примера; замена значений не всегда будет неэффективной.

R. Cox 23.11.2018 13:17
0
5
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, попробуйте это:

# Setup example dataframe
df = pd.DataFrame({"Class" : [1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3], 
                1:[1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,1], 
                2:[0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0],
                3:[0,0,1,1,1,0,1,1,0,0,1,1,1,0,1,1],
                4:[1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1], 
                5:[0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1],
                6:[0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1]}).set_index("Class")
# Do a filter on class, and store the positions/index of matching contents
class_to_edit=3
swappable_indices = np.where(df.index==class_to_edit)[0]
# Extract the column to edit
column_to_edit=1
column_values = df[column_to_edit].values

# Decide how many values to swap, and randomly assign swaps
# No guarantee here that the swaps will not contain the same values i.e. you could
# end up swapping 1's for 1's and 0's for 0's here - it's entirely random. 
number_of_swaps = 2
swap_pairs = np.random.choice(swappable_indices,number_of_swaps*2, replace=False)

# Using the swap pairs, build a map of substitutions, 
# starting with a vanilla no-swap map, then updating it with the generated swaps
swap_map = {e:e for e in range(0,len(column_values))}
swap_map.update({swappable_indices[e]:swappable_indices[e+1] for e in range(0,len(swap_pairs),2)})
swap_map.update({swappable_indices[e+1]:swappable_indices[e] for e in range(0,len(swap_pairs),2)})

# Having built the swap-map, apply it to the data in the column, 
column_values=[column_values[swap_map[e]] for e,v in enumerate(column_values)]
# and then plug the column back into the dataframe
df[column_to_edit]=column_values

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

В качестве альтернативы есть функция np.permute, которая может принести некоторые плоды с точки зрения добавления некоторого шума (хотя и не путем выполнения дискретных свопов).

[править] Для тестирования попробуйте набор данных с немного меньшей жесткостью, вот пример сгенерированного более случайным образом. Просто отредактируйте столбцы, которые вы хотите заменить, фиксированными значениями, если вы хотите наложить некоторый порядок в наборе данных.

df = pd.DataFrame({"Class" : [1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3], 
            1:np.random.choice([0,1],16), 
            2:np.random.choice([0,1],16),
            3:np.random.choice([0,1],16),
            4:np.random.choice([0,1],16), 
            5:np.random.choice([0,1],16),
            6:np.random.choice([0,1],16)}).set_index("Class")

Извините, я думал, что это сработало, но когда я меняю column_to_edit = 6, это не меняет. Я вижу, что иногда это не должно менять, но я пробовал это несколько раз.

R. Cox 23.11.2018 15:50

Это связано с тем, что при использовании предоставленных данных при фильтрации по class = 3 столбец 6 всегда содержит 1. Фактически то же самое для столбцов 3,4,5 и 6. А столбец 2 всегда содержит 0. Попробуйте использовать более рандомизированный набор данных. (отредактированный ответ, включающий один из способов его создания для теста)

Thomas Kimber 23.11.2018 15:59

Другие вопросы по теме