Python: проанализировать столбец CSV как индекс строки и столбца для np.array? - PullRequest
0 голосов
/ 03 августа 2020

Мой файл CSV отформатирован как таковой:

Id,Prediction
r1_c1,1
r3_c1,3
...

Когда я читаю файл csv как таковой:

df = pd.read_csv('data/data_train.csv', delimiter=',')

Я могу получить матрицу размера (N, 1) , где N - количество значений, присутствующих во входном CSV-файле. Обратите внимание, что в моем входном CSV-файле есть некоторые отсутствующие значения, поэтому я не могу сделать простую np.reshape

Есть ли необычная функция или процедура в pandas или np, которая заполняет матрицу A таким образом, что A[i][j] = v_ij, где v_ij - значение со связанным 'Id', равным ri_cj?

Очевидно, это можно было бы сделать с помощью a for l oop, но учтите, когда размер входной CSV-файл довольно велик ... например, было бы интересно использовать параллелизм / векторизацию, реализованную в numpy. Я не смог описать свою проблему с ключевыми словами, поэтому извиняюсь, если не смог найти соответствующую документацию.

1 Ответ

0 голосов
/ 04 августа 2020

Во-первых, при чтении файла csv с pd.read_csv читать Prediction столбец как предварительно определенный dtype (в случае этого примера это np.int32), чтобы сделать его более эффективным.

Затем запустите следующий код:

# Parse Id column string values as integer pairs of output array indices.
indices = np.empty((len(df), 2), np.int32)
for i, id_string in enumerate(df.Id):
    id_parts = id_string.split('_')
    indices[i, :] = int(id_parts[0][1:]), int(id_parts[1][1:])

# Infer shape of output array (OPTIONAL: used if output shape is not given).
n, m = np.max(indices, axis=0) + 1

# Create predictions output array with the same dtype.
out = np.zeros((n, m), df.dtypes.Prediction)

# Assign Prediction column values.
out[indices[:, 0], indices[:, 1]] = df.Prediction

Небольшие тестовые данные:

    Id  Prediction
0   r0_c2   5
1   r1_c1   8
2   r2_c0   7

Вывод (без указания формы вывода (n, m)):

[[0 0 5]
 [0 8 0]
 [7 0 0]]

I ' Мы также рассчитали время, используя функцию %%timeit при запуске 900000 строк данных с формой вывода (1000, 1000), и вот результаты:

1 l oop, лучшее из 3: 1,61 с на л oop

Надеюсь, это ответит на ваш вопрос, удачи!

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