我有一个物品清单。我也有一个数据框。如果列表中有3个项目,而数据框有4行,那么我要迭代并添加每个项目,然后复制该行并添加下一个项目,依此类推。因此最终结果是一个数据帧从4行变为12行( 4行乘以列表中的3个项目)。我尝试将df转换为列表,然后通过append和extend进行迭代,但这不是我想要的,它只是将值追加到列表中,而不是复制新列表并仅追加当前的迭代值。
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
答案 0 :(得分:3)
使用Performant cartesian product (CROSS JOIN) with pandas
进行检查newdf=df.assign(key=1).merge(pd.DataFrame({'key':[1]*len(b),'v':b})).drop('key',1)
答案 1 :(得分:1)
您可以使用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