Декартово произведение DataFrame и списка - PullRequest
0 голосов
/ 23 января 2019

У меня есть список предметов. У меня также есть датафрейм. Если в списке есть 3 элемента, а в информационном кадре 4 строки, я хочу повторить и добавить каждый элемент, а затем скопировать строку и добавить следующий элемент и т. Д. Таким образом, конечный результат - это информационный кадр, который перешел от 4 строк до 12 строк ( 4 строки по 3 элемента в списке). Я попытался преобразовать df в список, а затем выполнить итерации с помощью добавления и расширения, но это было не то, что я хотел, а просто добавление значений в список, а не копирование нового списка и добавление только текущего итеративного значения.

  group     start       stop
0   abc  1/1/2016   8/1/2016
1   xyz  5/1/2016  12/1/2016
2   jkl  3/7/2017  1/31/2018

b = ['a','b','c','d']

Ожидаемый результат - это фрейм данных, подобный этому:

group   start   stop    new col
abc 1/1/2016    8/1/2016    a
abc 1/1/2016    8/1/2016    b
abc 1/1/2016    8/1/2016    c
abc 1/1/2016    8/1/2016    d
xyz 5/1/2016    12/1/2016   a
xyz 5/1/2016    12/1/2016   b
xyz 5/1/2016    12/1/2016   c
xyz 5/1/2016    12/1/2016   d
jkl 3/7/2017    1/31/2018   a
jkl 3/7/2017    1/31/2018   b
jkl 3/7/2017    1/31/2018   c
jkl 3/7/2017    1/31/2018   d

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вы можете сделать это эффективно, используя np.repeat:

groups = ['a','b','c','d']  

arr = np.column_stack([
    df.values.repeat(len(groups), axis=0), 
    np.repeat(groups, len(df))
]) 
pd.DataFrame(arr, columns=[*df, 'new_col'])

   group     start       stop new_col
0    abc  1/1/2016   8/1/2016       a
1    abc  1/1/2016   8/1/2016       a
2    abc  1/1/2016   8/1/2016       a
3    abc  1/1/2016   8/1/2016       b
4    xyz  5/1/2016  12/1/2016       b
5    xyz  5/1/2016  12/1/2016       b
6    xyz  5/1/2016  12/1/2016       c
7    xyz  5/1/2016  12/1/2016       c
8    jkl  3/7/2017  1/31/2018       c
9    jkl  3/7/2017  1/31/2018       d
10   jkl  3/7/2017  1/31/2018       d
11   jkl  3/7/2017  1/31/2018       d
0 голосов
/ 23 января 2019

Проверка с помощью Производительное декартово произведение (CROSS JOIN) с пандами

newdf=df.assign(key=1).merge(pd.DataFrame({'key':[1]*len(b),'v':b})).drop('key',1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...