Pandas Groupby的笛卡尔积

时间:2018-04-06 09:39:40

标签: python pandas-groupby cartesian-product

我有一个数据框

DF:

col1    col2    col3
JHGK    B       name1
JHGK    B       name2
JHGK    C       name3
OPDR    B       name4
ERTH    B       name5
ERTH    C       name6

在对col1进行groupby之后,我想在(不同的col3值,其中col2 = B和不同的col3值,其中col2 = C)之间进行笛卡尔积。

结果数据框:

最后:

col1   n1     n2
JHGK   name1  name3
JHGK   name2  name3
ERTH   name5  name6

1 个答案:

答案 0 :(得分:2)

获取col2为B的df的子集,并获取col2为C的df的子集。然后在col1上进行连接,删除一些额外的列,然后重命名。 :)

>>> import pandas as pd
>>> df = pd.DataFrame({'col1': ['JHGK','JHGK','JHGK','OPDR','ERTH','ERTH'], 'col2': ['B','B','C','B','B','C'], 'col3': ['name1','name2','name3','name4','name5','name6']})
>>> df
   col1 col2   col3
0  JHGK    B  name1
1  JHGK    B  name2
2  JHGK    C  name3
3  OPDR    B  name4
4  ERTH    B  name5
5  ERTH    C  name6
>>> df_joined = df[df['col2'] == 'B'].merge(df[df['col2'] == 'C'], on='col1').drop(['col2_x', 'col2_y'], axis=1).rename(columns={'col3_x': 'n1', 'col3_y': 'n2'})
>>> df_joined
   col1     n1     n2
0  JHGK  name1  name3
1  JHGK  name2  name3
2  ERTH  name5  name6