Как я могу назначить комбинацию значений key1, key2 новому фрейму данных Pandas с ключом 1 и ключом в качестве индекса и заголовка

#python #pandas #dataframe #indexing

#python #pandas #фрейм данных #индексирование

Вопрос:

Я пытаюсь назначить определенную комбинацию Key_1, Key_2 и значений новому фрейму данных pandas. Фрейм данных состоит из Key_1 в качестве индекса и Key_2 в качестве столбцов.

Мой исходный фрейм данных выглядит следующим образом:

     Key_1   Key_2   Value
0   A6Z1    entry1  12
1   A6Z2    entry2  14
2   A6Z3    entry3  16
3   A6Z4    entry1  18
4   A6Z5    entry2  2
5   A6Z6    entry3  22
6   A6Z7    entry1  24
7   A6Z8    entry2  44
8   A6Z9    entry3  28
9   A6Z10   entry1  9
10  A6Z2    entry1  A
11  A6Z3    entry2  B
12  A6Z5    entry3  C
13  A6Z6    entry1  x
14  A6Z7    entry2  55
15  A6Z8    entry3  C
16  A6Z10   entry2  2
17  A6Z1    entry3  3
  

и я хочу преобразовать его в это:

     entry1  entry2  entry3
A6Z1    12  0   3
A6Z2    A   14  0
A6Z3    0   B   16
A6Z4    18  0   0
A6Z5    0   2   C
A6Z6    x   0   22
A6Z7    24  55  0
A6Z8    0   44  C
A6Z9    0   0   28
A6Z10   9   2   0
  

У меня есть рабочий код, но он чрезвычайно медленный для огромных наборов данных (> 1000).
Поэтому я ищу более быстрый способ достижения этого результата:

 import numpy as np
import sys

pd.options.mode.chained_assignment = None

#load Dataset
df = pd.read_excel(r'/Users/pascalkugler1/Downloads/Testa_Data.xlsx')

#create unique Index Names

rows = df['Key_1'].drop_duplicates()
rows = list(rows)


#create unique Headers

headers = df['Key_2'].drop_duplicates()
headers = list(headers)


#create an new Dataframe

empty_result = np.zeros((len(rows),len(headers)))
result = pd.DataFrame(empty_result,index = rows, columns = headers)


#assign the correct value from df depending on column and index

for (i, rows) in df.iterrows():
    for header in result:
       if df["Key_2"][i] == header:
         for (index, rows) in result.iterrows():
              if df["Key_1"][i] == index:
                    result[header][index] = df["Value"][i]
display(result)
´´´

Thank you! 

  

Ответ №1:

Попробуйте pandas pivot_table, ваш код должен быть примерно таким-

 res = df.pivot_table(index='Key_1', columns='Key_2', values='value', aggfunc='first')
  

Возможно, вам нужно будет заполнить 0 значениями —

 res.fillna(0)
  

Комментарии:

1. Спасибо! Я искал что-то подобное, оно работает точно так, как я хотел.