У меня есть два фрейма данных:
df_id:
name id
region 01 850
region 01 15062
region 02 851
df_combination:
Origin destination total
region 01 region 01 1954
region 01 region 02 39
Я должен выполнить все возможные комбинации между регионом 01 и регионом 02 и разделить сумму между общим количеством комбинаций.
Что-то вроде этого вывода:
Origin_id Destination_id Total_division
850 850 488.5
850 15062 488.5
15062 850 488.5
15062 15062 488.5
850 851 19.5
15062 851 19.5
У меня более 300 регионов, поэтому мне интересно, возможно ли это сделать с помощью кода Python (возможно, цикла).






Этот код даст вам именно то, что вы хотите, и эффективно ;-)
Он создает фрейм данных для каждой строки в df_combination и объединяет их все в конце.
import pandas as pd
from itertools import product
dict_region_to_ids = {reg: list(ids) for reg, ids in df_id.groupby("name")["id"]}
dfs = []
for r1, r2, total in df_combination.itertuples(index=False):
df = pd.DataFrame(product(dict_region_to_ids[r1], dict_region_to_ids[r2]),
columns=["Origin_id", "Destination_id"])
df["Total_division"] = total / len(df)
dfs.append(df)
df = pd.concat(dfs)
df
Вот еще одно предложение:
df = df_combination.merge(df_id, left_on='Origin', right_on='name')
df = df.merge(df_id, left_on='destination', right_on='name')
for _, group in df.groupby(['Origin', 'destination']):
df.loc[group.index, 'total'] /= group.shape[0]
df = df[['id_x', 'id_y', 'total']].rename(
columns = {'id_x': 'Origin_id', 'id_y': 'Destination_id',
'total': 'Total_division'}
)
Результат (print(df)):
Origin_id Destination_id Total_division
0 850 850 488.5
1 850 15062 488.5
2 15062 850 488.5
3 15062 15062 488.5
4 850 851 19.5
5 15062 851 19.5
МОЙ БОГ!! Вы спасли мою жизнь!!! СПАСИБО ОГРОМНОЕ!!!!!!!!! <3