Повторять pandas строк в зависимости от содержимого списка - PullRequest
2 голосов
/ 08 июля 2020

У меня есть большой pandas dataframe df как:

Col1    Col2
2       4
3       5

У меня есть большой список:

['2020-08-01', '2021-09-01', '2021-11-01']

Я пытаюсь достичь следующего:

Col1    Col2    StartDate
2       4       8/1/2020
3       5       8/1/2020
2       4       9/1/2021
3       5       9/1/2021
2       4       11/1/2021
3       5       11/1/2021

Обычно мозаика кадра данных df при добавлении элементов списка в качестве нового столбца. Я не знаю, как к этому подойти?

Ответы [ 5 ]

3 голосов
/ 08 июля 2020

Вы также можете перекрестное соединение, используя merge после создания df из списка:

l = ['2020-08-01', '2021-09-01', '2021-11-01']

(df.assign(k=1).merge(pd.DataFrame({'StartDate':l, 'k':1}),on='k')
   .sort_values('StartDate').drop("k",1))
   Col1  Col2   StartDate
0     2     4  2020-08-01
3     3     5  2020-08-01
1     2     4  2021-09-01
4     3     5  2021-09-01
2     2     4  2021-11-01
5     3     5  2021-11-01
3 голосов
/ 08 июля 2020

Позволяет использовать понимание списка с assign и pd.concat:

l = ['2020-08-01', '2021-09-01', '2021-11-01']
pd.concat([df1.assign(startDate=i) for i in l], ignore_index=True)

Вывод:

   Col1  Col2   startDate
0     2     4  2020-08-01
1     3     5  2020-08-01
2     2     4  2021-09-01
3     3     5  2021-09-01
4     2     4  2021-11-01
5     3     5  2021-11-01
3 голосов
/ 08 июля 2020

Вы можете попробовать комбинацию np.tile и np.repeat:

df.loc[np.tile(df.index,len(lst))].assign(StartDate=np.repeat(lst,len(df)))

Вывод:

   Col1  Col2   StartDate
0     2     4  2020-08-01
1     3     5  2020-08-01
0     2     4  2021-09-01
1     3     5  2021-09-01
0     2     4  2021-11-01
1     3     5  2021-11-01
2 голосов
/ 08 июля 2020

Я могу сделать itertools, обратите внимание, что порядок может быть снижен с помощью sort_values на основе столбца 1

import itertools
df=pd.DataFrame([*itertools.product(df.index,l)]).set_index(0).join(df)
            1  Col1  Col2
0  2020-08-01     2     4
0  2021-09-01     2     4
0  2021-11-01     2     4
1  2020-08-01     3     5
1  2021-09-01     3     5
1  2021-11-01     3     5
2 голосов
/ 08 июля 2020

Я бы использовал concat :

df = pd.DataFrame({'col1': [2,3], 'col2': [4, 5]})
dict_dfs = {k: df for k in ['2020-08-01', '2021-09-01', '2021-11-01']}
pd.concat(dict_dfs)

Затем вы можете переименовать и очистить индекс.

              col1  col2
2020-08-01 0     2     4
           1     3     5
2021-09-01 0     2     4
           1     3     5
2021-11-01 0     2     4
           1     3     5
...