pandas-two列的值是list,需要生成一个新的df来显示它们之间的所有值组合

时间:2017-10-25 01:09:38

标签: python pandas dataframe

假设我们有:

df1=
col1      col2     col3
[a,b]    [c,d]     0.5
[e,f]    [g,h]     0.7

想要根据df1:

返回一个新的df2
df2=
col1  col2  col3
 a     c    0.5
 a     d    0.5
 b     c    0.5
 b     d    0.5
 e     g    0.7
 e     h    0.7
 f     g    0.7
 f     h    0.7

基本上,需要在df1的col1和col2中显示列表之间的所有组合,列表的长度可能大于2.

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我打破了步骤

import itertools
df['Min']=list(zip(df.col1,df.col2))
df['New']=df.Min.apply(lambda x : list(itertools.product(x[0],x[1])))
df1=df.set_index('col3')['New']
df1.apply(pd.Series).stack().apply(pd.Series).reset_index().\
       drop('level_1',1).rename(columns={0:'col1',1:'col2'})

Out[588]: 
   col3 col1 col2
0   0.5    a    c
1   0.5    a    d
2   0.5    b    c
3   0.5    b    d
4   0.7    e    g
5   0.7    e    h
6   0.7    f    g
7   0.7    f    h

答案 1 :(得分:1)

一种hacky方式只是写出理解:

In [11]: pd.DataFrame([{"col1": c1, "col2": c2, "col3": row["col3"]} 
                       for _, row in df.iterrows()
                       for c1 in row["col1"] for c2 in row["col2"]])
Out[11]:
  col1 col2  col3
0    a    c   0.5
1    a    d   0.5
2    b    c   0.5
3    b    d   0.5
4    e    g   0.7
5    e    h   0.7
6    f    g   0.7
7    f    h   0.7