Добавьте значения двух Dataframe на основе похожих значений строк.Python

Программы на Python
Anonymous
Добавьте значения двух Dataframe на основе похожих значений строк.

Сообщение Anonymous »

ОТРЕДАКТИРОВАНО ДЛЯ ЯСНОСТИ
Я работаю над моделью региональной электроэнергетической системы
в настоящее время у меня есть два кадра данных: один содержит информацию о муниципалитете и энергетическом узле, другой - энергию спрос с течением времени в муниципалитете, как показано ниже (а не фактический df, который я использую)

Код: Выделить всё

municip = {
"muni_id": [1401, 1402, 1407, 1415, 1419, 1480, 1480, 1427, 1484],
"muni_name": ["Har", "Par", "Ock", "Ste", "Tjo", "Gbg", "Gbg", "Sot", "Lys"],
"new_muni_id": [1401, 1402, 1480, 1415, 1415, 1480, 1480, 1484, 1484],
"new_muni_name": ["Har", "Har", "Gbg", "Ste", "Ste", "Gbg", "Gbg", "Lys", "Lys"],
"new_node_id": ["HAR1", "PAR1", "GBG2", "STE1", "STE1", "GBG1", "GBG2", "LYS1", "LYS1"]
}

df_1 = pd.DataFrame(municip)

demand = {
"period": [1, 2, 3, 4, 5],
1401: [2, 4, 4, 1, 2],
1402: [1, 1, 3, 3, 5],
1407: [2, 4, 4, 1, 2],
1415: [1, 1, 3, 3, 5],
1419: [1, 1, 3, 3, 5],
1480: [1, 1, 3, 3, 5],
1427: [2, 4, 4, 1, 2],
1484: [1, 2, 3, 4, 5]
}

df_2 = pd.DataFrame(demand)
есть «старые» и «новые» muni_id и имя, потому что в некоторых муниципалитетах может не быть узла, поэтому я агрегировал спрос до ближайшего узла. df_2 — это спрос во всем муниципалитете, причем число в столбцах указывает muni_id.
Мое намерение состоит в том, чтобы назначить муниципальный спрос на энергетический узел единым способом распределения (в качестве начала для простоты).
Я попробовал следующее:
  • создать новый фрейм данных со столбцами периода и списком узлы
  • назначают спрос на муниципалитет с одинаковым старым и новым идентификатором/названием, разделенный на количество узлов в этом же муниципалитете, для В приведенном выше примере Gbg имеет 2 узла (GBG1 и GBG2), поэтому спрос на GBG1 и GBG2 будет равен 1480 (Gbg), разделенному на два.
  • Для муниципалитетов, которые имеют разные старый и новый идентификатор/название, требование старого идентификатора муниципалитета будет добавлено к требованию назначенного узла на основе предыдущего шага. например, в df_1 muni_id 1407 (Ock) назначен узлу GBG2, поэтому потребность GBG2 в первом периоде будет равна 2,5, где 0,5 — это предыдущий шаг (потребность Gbg / 2), 2 — текущий шаг (потребность Ок)

Код: Выделить всё

import pandas as pd

def profiling(df_1, df_2):

# create empty df
nodes = df_1["new_node_id"].unique()
node_df = pd.DataFrame(columns=["period"] + list(nodes))
node_df["period"] = df_2["period"]

# loop based on node id
for node in nodes:
node_info = df_1[df_1["new_node_id"] == node]
muni_id = node_info["muni_id"].values[0]
new_muni_id = node_info["new_muni_id"].values[0]

# assign demand to all nodes that has same old/new id
if muni_id == new_muni_id :
cumul_node = len(df_1[df_1["muni_id"] == muni_id])
node_df[node] = df_2[muni_id] / cumul_node

# assign demand to node for muni that has different old/new id
else:
cumul_node = len(df_1[df_1["new_muni_id"] == new_muni_id])
add_demand = df_2[muni_id] / cumul_node

if node in node_df:
node_df[node] += add_demand
else:
node_df[node] = add_demand

return node_df
Однако это приводит к тому, что некоторые узлы возвращают значения NaN, особенно муниципалитеты, которые имеют разные старые и новые идентификаторы, как показано в таблице ниже.



период
HAR1
PAR1
GBG2
STE1
GBG1
LYS1




1
2
1
Нет
1
0,5
Нет


2
4
1
Нет
1< /td>
0,5
Нет


3
4
3
Нет
3
1,5
Нет


4< /td>
1
3
Нет
3
1,5
Нет


5
2
5
Нет
5
2,5
Нет



по моей логике, почасовая потребность GBG2 должна составлять половину от 1480 (Gbg muni) + 1407 (Ock muni), поскольку Ock назначается GBG2 как новый узел, т.е. 2,5 в первом периоде. То же самое касается узла LYS1, где общая потребность составит 1427 (Sot) и 1484 (Lys).
Поэтому я ожидаю получить что-то вроде этого



период
HAR1
PAR1
GBG2
STE1
GBG1
LYS1




1
2
1
2,5
1
0,5
< td>3


2
4< /td>
1
4,5
1
0,5
6


3
4
3
5,5
3
1,5
7


4
1
3
2,5
3
1,5
5< /td>


5
2
5
4,5
5
2,5
7



Может ли кто-нибудь улучшить мою функцию, или, возможно, в моей логике добавления значений есть ошибка?
Извините за длинный вопрос и заранее спасибо за помощь!

Подробнее здесь: https://stackoverflow.com/questions/786 ... row-values

Вернуться в «Python»