DataFrame和列表的笛卡尔积
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataFrame和列表的笛卡尔积相关的知识,希望对你有一定的参考价值。
我有一个项目清单。我也有一个数据帧。如果列表有3个项目且数据框有4行,我想迭代并添加每个项目,然后复制行并添加下一个项目等。所以最终结果是一个从4行到12行的数据帧( 4行乘以列表中的3个项目)。我尝试将df转换为list然后通过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
答案
查看Performant cartesian product (CROSS JOIN) with pandas
newdf=df.assign(key=1).merge(pd.DataFrame({'key':[1]*len(b),'v':b})).drop('key',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
以上是关于DataFrame和列表的笛卡尔积的主要内容,如果未能解决你的问题,请参考以下文章
#pandas使用merge函数将两个pandas dataframe通过笛卡尔积(cartesian product)方式连接起来生成新的dataframe数据