У меня есть CSV с данными, которые я хочу импортировать в ndarray, чтобы я мог управлять им. Данные в формате csv отформатированы следующим образом.
u i r c
1 1 5 1
2 2 5 1
3 3 1 0
4 4 1 1
Я хочу получить все элементы с c = 1 в ряд, а элементы с c = 0 в другом, например, чтобы уменьшить размерность.
1 1 1 5 2 2 5 4 4 1
0 3 3 1
Однако разные u и i не могут быть в одном столбце, поэтому конечный результат требует заполнения нулями, как этот. Я хочу сохранить столбец переменной c, поскольку он представляет собой категориальную переменную, поэтому мне нужно сохранить ее значение, чтобы можно было сделать соответствие между информацией и значением c. Я не хочу просто разделять данные в соответствии со значением c.
1 1 1 5 2 2 5 0 0 0 4 4 1
0 0 0 0 0 0 0 3 3 1 0 0 0
Пока что я читаю файл .csv с df = pd.read_csv
и создаю многомерный массив / тензор, используяarr=df.to_numpy()
. После этого я переставляю порядок столбцов, чтобы столбец c был первым, получая этот массив [[ 1 1 1 5][ 1 2 2 5][ 0 3 3 1][ 1 4 4 1]]
.
Затем я делаю arr = arr.reshape(2,)
, поскольку есть два возможных значения для c, а затем удаляю все, кроме первого столбца c, в соответствии с длиной кортежей. Так что в этом случае, так как в каждом кортеже 4 элемента и 16 элементов, я делаю arr = np.delete(arr, (4,8,12), axis=1)
.
Наконец, я делаю это, чтобы заполнить массив нулями, когда вы не совпадаете с обоими столбцами.
nomatch = 0
for j in range(1, cols, 3):
if arr[0][j] != arr[1][j]:
nomatch+=1
z = np.zeros(nomatch*3, dtype=arr.dtype)
h1 = np.split(arr, [0][0])
new0 = np.concatenate((arr[0],z))
new1 = np.concatenate((z,arr[1])) # problem
final = np.concatenate((new0, new1))
В строке с комментарием проблема заключается в том, как объединить массив при сохранении первого элемента. Вместо того, чтобы просто добавлять, я хотел бы иметь возможность установить начальный и конечный индексы и устанавливать нули только на эти индексы. Используя concatenate, я не получаю ожидаемого результата, так как я изменяю первый элемент (заголовок массива должен быть нетронутым).
Кроме того, я не могу не задаться вопросом, является ли это хорошим способом достижения конечного результата. В качестве примера я попытался заполнить массив изменением размера перед изменением формы np.resize()
, но это не работает, когда я печатаю результат, массив такой же, как и предыдущий, независимо от размеров, которые я использую в качестве аргумента. Хорошим решением было бы то, которое было бы адаптировано, если бы было 3 или более возможных значения для c, и это могло бы включать несколько c-подобных значений, таких как c1, c2 ..., которые стали бы строками в таблице. Я заранее ценю все отзывы и предложения.