Создать словарь на основе индекса кадра данных матрицы и значения второго кадра данных - PullRequest
0 голосов
/ 18 июня 2020

У меня есть следующий фрейм данных CSV df, импортированный с использованием pandas df= pd.read_csv("Example.csv", header=0, index_col="Forest") (значения numeri c - это расстояния)

Forest,Bell Bay,Surrey Hills,Smithton,Hobart
Coupe 1,158,194,10,49
Coupe 2,156,169,71,84
Coupe 3,10,186,101,163
Coupe 4,47,94,134,139
Coupe 5,144,61,135,56
Coupe 6,27,27,134,36
Coupe 7,114,4,143,113
Coupe 8,71,170,190,140
Coupe 9,94,54,73,128
Coupe 10,46,194,92,36

У меня импортирован второй фрейм данных df2 с использованием df2 = pd.read_csv("ExampleSupply.csv", header=0, index_col="Forest") (числовые значения c являются объемами поставки)

Forest,Supply
Coupe 1,600
Coupe 2,100
Coupe 3,900
Coupe 4,300
Coupe 5,300
Coupe 6,400
Coupe 7,900
Coupe 8,700
Coupe 9,500
Coupe 10,300

Столбец Forest соответствует двум фреймам данных. Я создал список лесов I из df, используя:

I = df.index.tolist()

Результат:

['Coupe 1', 'Coupe 2', 'Coupe 3', 'Coupe 4', 'Coupe 5', 'Coupe 6', 'Coupe 7', 'Coupe 8', 'Coupe 9', 'Coupe 10']

И список мест назначения J в df, используя:

J = df.columns.values.tolist()

Результат:

['Bell Bay', 'Surrey Hills', 'Smithton', 'Hobart']

Список кортежей (дуг) был создан с использованием:

arcs = [(i, j) for i in I for j in J]

Результат:

[('Coupe 1', 'Bell Bay'), ('Coupe 1', 'Surrey Hills'), ('Coupe 1', 'Smithton'), ('Coupe 1', 'Hobart'), ('Coupe 2', 'Bell Bay'), ('Coupe 2', 'Surrey Hills'), ('Coupe 2', 'Smithton'), ('Coupe 2', 'Hobart'), ('Coupe 3', 'Bell Bay'), ('Coupe 3', 'Surrey Hills'), ('Coupe 3', 'Smithton'), ('Coupe 3', 'Hobart'), ('Coupe 4', 'Bell Bay'), ('Coupe 4', 'Surrey Hills'), ('Coupe 4', 'Smithton'), ('Coupe 4', 'Hobart'), ('Coupe 5', 'Bell Bay'), ('Coupe 5', 'Surrey Hills'), ('Coupe 5', 'Smithton'), ('Coupe 5', 'Hobart'), ('Coupe 6', 'Bell Bay'), ('Coupe 6', 'Surrey Hills'), ('Coupe 6', 'Smithton'), ('Coupe 6', 'Hobart'), ('Coupe 7', 'Bell Bay'), ('Coupe 7', 'Surrey Hills'), ('Coupe 7', 'Smithton'), ('Coupe 7', 'Hobart'), ('Coupe 8', 'Bell Bay'), ('Coupe 8', 'Surrey Hills'), ('Coupe 8', 'Smithton'), ('Coupe 8', 'Hobart'), ('Coupe 9', 'Bell Bay'), ('Coupe 9', 'Surrey Hills'), ('Coupe 9', 'Smithton'), ('Coupe 9', 'Hobart'), ('Coupe 10', 'Bell Bay'), ('Coupe 10', 'Surrey Hills'), ('Coupe 10', 'Smithton'), ('Coupe 10', 'Hobart')]

Я хочу создать словарь row index в df (это относится к Forest в I) и количественных значений в df2. Словарь должен выглядеть так:

dQ = {'Coupe 1': 600, 'Coupe 2': 100, 'Coupe 3': 900, 'Coupe 4': 300, 'Coupe 5': 300, 'Coupe 6': 400, 'Coupe 7': 900, 'Coupe 8': 700, 'Coupe 9': 500, 'Coupe 10': 300}

Значения количества Supply в df2 должны быть связаны с Forest в df путем ссылки на список I или клавишу в arcs.

Кто-нибудь может предложить лучший способ составить этот словарь? Это только небольшой набор I (10) и J (4) в объединенной матрице. Мои методы должны быть применимы к очень большим наборам данных с более чем 10 миллионами комбинаций I * J. Помощь будет очень признательна!

1 Ответ

0 голосов
/ 18 июня 2020

Вам нужно l oop по списку I, найти соответствующую строку в df2, выбрать df2['Supply'] и добавить его в желаемый dict.

dQ = {}
for forest in I:
    dQ[forest] = df2.loc[forest]['Supply']
print(dQ)

Результат:

{'Coupe 1': 600, 'Coupe 2': 100, 'Coupe 3': 900, 'Coupe 4': 300, 'Coupe 5': 300, 'Coupe 6': 400, 'Coupe 7': 900, 'Coupe 8': 700, 'Coupe 9': 500, 'Coupe 10': 300}

Pythoni c way -

dQ = {forest: df2.loc[forest]['Supply'] for forest in I}

Вопрос - Почему вам нужно искать «Лес» из df, поскольку ваш df2 уже имеет такой же индекс и значения "Forest" совпадают. Если вы можете просто использовать данные df2 и сделать то же самое - преобразуйте df2 в dict, используя

df2.to_dict()['Supply']

Он также должен дать вам тот же результат

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