根据列表内容重复熊猫行

时间:2020-07-08 17:26:33

标签: pandas python-3.8

我的大熊猫数据框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,同时将list的元素添加为新列。我不确定该如何处理?

5 个答案:

答案 0 :(得分:3)

您可以尝试使用np.tilenp.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

答案 1 :(得分:3)

从列表创建df之后,您还可以使用merge交叉加入:

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

答案 2 :(得分:3)

让列表理解与assignpd.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 :(得分:2)

我会使用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

答案 4 :(得分:2)

我可以做itertools,请注意,根据第1列,可以使用sort_values下达订单

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