Сопоставить столбцы данных pandas с массивом - PullRequest
0 голосов
/ 10 января 2020

У меня есть такой фрейм данных: Dataframe

{'choice_0': {0: 52, 1: 26, 2: 100, 3: 2, 4: 53},
 'choice_1': {0: 38, 1: 4, 2: 54, 3: 95, 4: 1},
 'choice_2': {0: 12, 1: 82, 2: 25, 3: 1, 4: 47},
 'choice_3': {0: 82, 1: 5, 2: 12, 3: 96, 4: 93},
 'choice_4': {0: 33, 1: 11, 2: 27, 3: 32, 4: 26},
 'choice_5': {0: 75, 1: 47, 2: 82, 3: 6, 4: 3},
 'choice_6': {0: 64, 1: 38, 2: 10, 3: 40, 4: 46},
 'choice_7': {0: 76, 1: 6, 2: 89, 3: 31, 4: 16},
 'choice_8': {0: 10, 1: 66, 2: 80, 3: 9, 4: 42},
 'choice_9': {0: 28, 1: 61, 2: 33, 3: 59, 4: 39},
 'n_people': {0: 4, 1: 4, 2: 3, 3: 2, 4: 4}}

И массив вроде:

input_arr = (
    np.array([[   0,   52],
              [   1,   82],
              [   2,  27],
              [   3,   2],
              [   4,   53]]))

Первый элемент будет для family_id = 0 и столбец "choice_0" = 52

Второй элемент будет для family_id = 1, а столбец "choice_2" = 82

Третий элемент будет для family_id = 2 и столбца "choice_4" = 27

И я хотел бы получить:

    array([[   0,   0],
    [   1,   2],
    [   2,  3],
    [   3,   0],
    [   4,   0])

Лог c будет:

  • Для family_id = 0 Исходный массив имеет aa 52. И я хотел бы получить 0, потому что он принадлежит столбцу "choice_0".
  • Для family_id = 1 Исходный массив имеет 82. И я хотел бы получить 2, потому что он принадлежит Колонка «choice_2».

Примечание: номер в ряду (family_id) не может быть повторен.

Я даже не знаю, какое название, не стесняйтесь менять это.

1 Ответ

1 голос
/ 10 января 2020

Предположим, у вас есть:

df = pd.DataFrame.from_dict({'family_id': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4},
 'choice_0': {0: 52, 1: 26, 2: 100, 3: 2, 4: 53},
 'choice_1': {0: 38, 1: 4, 2: 54, 3: 95, 4: 1},
 'choice_2': {0: 12, 1: 82, 2: 25, 3: 1, 4: 47},
 'choice_3': {0: 82, 1: 5, 2: 12, 3: 96, 4: 93},
 'choice_4': {0: 33, 1: 11, 2: 27, 3: 32, 4: 26},
 'choice_5': {0: 75, 1: 47, 2: 82, 3: 6, 4: 3}})


input_arr = (
    np.array([[   0,   52],
              [   1,   82],
              [   2,  27]])
)

Вы можете получить желаемый результат, используя понимание списка.

output_arrary=np.array([[e[0], df.iloc[i].tolist().index(e[1])-1] for i, e in enumerate(input_arr)])

print(output_arrary)

[[0 0]
 [1 2]
 [2 4]]
...