DataFrame和列表的笛卡尔积

时间:2019-01-23 20:18:45

标签: python pandas list dataframe

我有一个物品清单。我也有一个数据框。如果列表中有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

2 个答案:

答案 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