import pandas as pd
def get_pairs(keys: list, data: list) -> dict:
"""
Подготовительная функция
Раскладывает значения из data по ключам из key в порядке, как в key
:param keys: ['foo', 'spam', 'foo', ...]
:param data: [('foo', 'bar'), ('foo', 'baz'), ('spam', 'ham'), ...]
:return: {'foo': ['bar', 'baz'], 'spam': ['ham'], ...}
"""
inter_pairs = dict([(key, []) for key in set(keys)])
while bool(len(data)):
key, value = data.pop(0)
inter_pairs[key].append(value)
return inter_pairs
def prepare_next_attr(key: str, value: str, descr: list) -> tuple:
"""
Служебная функция
Готовит очередной комплект атрибутов
для вычисления следующего результата
:param key:
:param value:
:param descr:
:return: next_key, next_pair, next_descr
"""
descr = [i.lower() for i in descr]
next_key = f'{key.lower()}, '
next_pair = f'{next_key}{value.lower()}'
next_descr = descr.pop(0)
return next_key, next_pair, next_descr
def get_next_res_item(key: str, value: str, descr: list) -> str:
"""
Служебная функция
Готовит результат, сравнивая по Descr
(тут подгонка if-ами под задание)
:param key:
:param value:
:param descr:
:return: результат для помещения в список результатов
"""
next_key, next_pair, next_descr = prepare_next_attr(key, value, descr)
if next_pair == next_descr:
res_item = f'{key}: {value};'
elif next_key in next_descr:
res_item = f'{key};'
else:
res_item = f'{key}'
return res_item
def make_result(keys: list, inter_pairs: dict, descr: list) -> pd.Series:
"""
Перебирает ключи, получает для каждого очередной результат,
складывает результаты в pd.Series
:param keys:
:param inter_pairs:
:param descr:
:return: pd.Series с результатами
"""
intermedia_result = []
for key in keys:
value = inter_pairs[key].pop(0)
intermedia_result.append(
get_next_res_item(key,
value,
descr)
)
return pd.Series(intermedia_result)
if __name__ == '__main__':
df1 = {
'Descr': ["VALVE, PRESSURE", "pump ttf", "Valve, electrical", "Geeku, electrical",
"VALVE, OVERBOARD, BUTTERFLY"],
'N_Product': ["VALVE", "PUMP", "VALVE", "GEEKU", "VALVE"],
}
df2 = {'N_Product': ["VALVE", "VALVE", "VALVE", "PUMP", "GEEKU"],
'M_Product': ["PRESSURE", "qwerty", "", "", "ELECTRICAL"],
}
target = {
'Descr': ["VALVE, PRESSURE", "pump ttf", "Valve, electrical", "Geeku, electrical", "VALVE, OVERBOARD, "
"BUTTERFLY"],
'N_Product': ["VALVE", "PUMP", "VALVE", "GEEKU", "VALVE"],
'Result': ["VALVE: PRESSURE;", "PUMP", "VALVE;", "GEEKU: ELECTRICAL;", "VALVE;"], }
df1 = pd.DataFrame(df1)
df2 = pd.DataFrame(df2)
df_target = pd.DataFrame(target)
df2_list = list(zip(df2['N_Product'], df2['M_Product']))
pairs = get_pairs(df1['N_Product'], df2_list)
result = make_result(df1['N_Product'], pairs, df1['Descr'])
df1['Result'] = result.values
print(df1)
print(all(df1 == df_target))