Pandas Dataframe的每一个组合

时间:2017-10-24 01:01:46

标签: pandas csv dataframe merge combinations

大家好!

我有一个问题,多数据帧合并,组合。

请检查以下csv。

我想要每个组合(用户 - 内容)

换句话说,用户拥有所有contentInformation

请帮助我,谢谢!

UserID Age
U-1    10 
U-2    20
U-3    30

ContentID ContentName Genre
C-1       T-1         Action
C-2       T-2         Game
C-3       T-3         SNS
C-4       T-4         Music

我想看下面。

UserID ContentID Age ContentName Genre
U-1    C-1       10  T-1         Action
U-1    C-2       10  T-2         Game
U-1    C-3       10  T-3         SNS
U-1    C-4       10  T-4         Music
U-2    C-1       20  T-1         Action
U-2    C-2       20  T-2         Game
U-2    C-3       20  T-3         SNS
U-2    C-4       20  T-4         Music
U-3    C-1       30  T-1         Action
U-3    C-2       30  T-2         Game
U-3    C-3       30  T-3         SNS
U-3    C-4       30  T-4         Music

2 个答案:

答案 0 :(得分:1)

进行交叉连接的一个巧妙方法是在虚拟列上merge

df1.assign(foo=1).merge(df2.assign(foo=1)).drop('foo', 1)

   UserID  Age ContentID ContentName   Genre
0     U-1   10       C-1         T-1  Action
1     U-1   10       C-2         T-2    Game
2     U-1   10       C-3         T-3     SNS
3     U-1   10       C-4         T-4   Music
4     U-2   20       C-1         T-1  Action
5     U-2   20       C-2         T-2    Game
6     U-2   20       C-3         T-3     SNS
7     U-2   20       C-4         T-4   Music
8     U-3   30       C-1         T-1  Action
9     U-3   30       C-2         T-2    Game
10    U-3   30       C-3         T-3     SNS
11    U-3   30       C-4         T-4   Music

如果您想设置MultiIndex,可以通过创建一个MultIndex.from_product并在交叉联接的结果上调用set_index来执行此操作:

idx = pd.MultiIndex.from_product((df1.index, df2.index))
df = df1.assign(foo=1).merge(df2.assign(foo=1)).drop('foo', 1)

df.set_index(idx).rename_axis(['User', 'Game'], 0)

          UserID  Age ContentID ContentName   Genre
User Game                                          
0    0       U-1   10       C-1         T-1  Action
     1       U-1   10       C-2         T-2    Game
     2       U-1   10       C-3         T-3     SNS
     3       U-1   10       C-4         T-4   Music
1    0       U-2   20       C-1         T-1  Action
     1       U-2   20       C-2         T-2    Game
     2       U-2   20       C-3         T-3     SNS
     3       U-2   20       C-4         T-4   Music
2    0       U-3   30       C-1         T-1  Action
     1       U-3   30       C-2         T-2    Game
     2       U-3   30       C-3         T-3     SNS
     3       U-3   30       C-4         T-4   Music

答案 1 :(得分:1)

有点想念LOL。

df2['v']=[df1.values.tolist()]*len(df2)
df=df2.set_index(['ContentID','ContentName','Genre']).v.apply(pd.Series).stack().reset_index().drop('level_3',1)
df[df1.columns]=df[0].apply(pd.Series)
df.sort_values('UserID').drop(0,1)


Out[421]: 
   ContentID ContentName   Genre UserID  Age
0        C-1         T-1  Action    U-1   10
3        C-2         T-2    Game    U-1   10
6        C-3         T-3     SNS    U-1   10
9        C-4         T-4   Music    U-1   10
1        C-1         T-1  Action    U-2   20
4        C-2         T-2    Game    U-2   20
7        C-3         T-3     SNS    U-2   20
10       C-4         T-4   Music    U-2   20
2        C-1         T-1  Action    U-3   30
5        C-2         T-2    Game    U-3   30
8        C-3         T-3     SNS    U-3   30
11       C-4         T-4   Music    U-3   30