大家好!
我有一个问题,多数据帧合并,组合。
请检查以下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
答案 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