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数据

pandas 中的笛卡尔积

如何创建包含范围内但不在索引中的日期的 MultiIndex 的笛卡尔积

无限列表的 Haskell 笛卡尔积

如何迭代列表的笛卡尔积

列表列表的笛卡尔积