Python(Pandas) выделение списка из строки и добавление в разные строки

Всем доброго дня. Не нашел подобную тему, возможно ли сделать такое:

Допустим, что у нас есть список с наименованием клиентов, client = [1, 2, 3, 4]. Есть услуги, которые находятся под запретом для всех клиентов из списка usl = ['услуга1', 'услуга2', 'услуга3', 'услуга4']

введите сюда описание изображения

Необходимо создать DataFrame, где для каждого клиент буду указаны все услуги, которые находятся под запретом, т.е. :

Пример1

Соответственно после клиента 1, должен идти клиент 2, который также будет иметь строки с услугами от 1 от 4:

Пример2

Соответственно хотелось бы взять во внимание, что клиентов может быть больше чем услуг.

Пока на ум приходит только подобны решения, но не понимаю как привести все к 2 столбца и кучи строк: Пример4

Заметил нюанс, что если формировать DataFrame таким методом, то все формируется корректно: Пример5

Но как только мы добавляем дополнительное значения, во 2 столбце формируются список. Пример6

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

Спасибо всем большое!


Ответы (2 шт):

Автор решения: CrazyElf

Непонятно, какую задачу вы на самом деле решаете. Но можно использовать функцию product из библиотеки itertools:

import pandas as pd
from itertools import product

client = [1, 2, 3, 4]
usl = ['услуга1', 'услуга2', 'услуга3', 'услуга4']
df = pd.DataFrame(product(client, usl), columns=['Клиенты', 'Услуги'])
print(df)

Вывод:

    Клиенты   Услуги
0         1  услуга1
1         1  услуга2
2         1  услуга3
3         1  услуга4
4         2  услуга1
5         2  услуга2
6         2  услуга3
7         2  услуга4
8         3  услуга1
9         3  услуга2
10        3  услуга3
11        3  услуга4
12        4  услуга1
13        4  услуга2
14        4  услуга3
15        4  услуга4

Ну или можно правильно "размножить" данные вручную, без библиотек:

df = pd.DataFrame({
    'Клиенты': [i for i in client for _ in usl],
    'Услуги': usl * len(client)
})
→ Ссылка
Автор решения: Алексей Р

Можно так, используя метод explode():

df = pd.DataFrame({'client': client, 'usl': [usl] * len(client)}).explode('usl')

или так, используя метод merge() с аргументом how='cross'

df = pd.DataFrame({'client': client}).merge(pd.Series(usl, name='usl'), how='cross')
→ Ссылка