#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. Спасибо! Я искал что-то подобное, оно работает точно так, как я хотел.