Python(Pandas) выделение списка из строки и добавление в разные строки
Всем доброго дня. Не нашел подобную тему, возможно ли сделать такое:
Допустим, что у нас есть список с наименованием клиентов, client = [1, 2, 3, 4]. Есть услуги, которые находятся под запретом для всех клиентов из списка usl = ['услуга1', 'услуга2', 'услуга3', 'услуга4']
Необходимо создать DataFrame, где для каждого клиент буду указаны все услуги, которые находятся под запретом, т.е. :
Соответственно после клиента 1, должен идти клиент 2, который также будет иметь строки с услугами от 1 от 4:
Соответственно хотелось бы взять во внимание, что клиентов может быть больше чем услуг.
Пока на ум приходит только подобны решения, но не понимаю как привести все к 2 столбца и кучи строк:

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

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

Скажите пожалуйста, есть возможность расфасовать эти списки согласно заданию, либо есть какие - либо ещё варианты решения данной задачи?
Спасибо всем большое!
Ответы (2 шт):
Непонятно, какую задачу вы на самом деле решаете. Но можно использовать функцию 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')


