Python:尝试交叉应用两个数据帧
我试图获得一个数据帧,它在两个不同的数据帧中包含两个单独列的所有组合。我的数据帧如下所示:Python:尝试交叉应用两个数据帧,python,pandas,dataframe,apply,Python,Pandas,Dataframe,Apply,我试图获得一个数据帧,它在两个不同的数据帧中包含两个单独列的所有组合。我的数据帧如下所示: >>>first_df >>>second_df id test id text 0 1 abc 0 11 uvw 1 2 def
>>>first_df >>>second_df
id test id text
0 1 abc 0 11 uvw
1 2 def 1 22 xyz
2 3 ghi
由此,我能够使用这种方法获得组合:
df = pd.DataFrame(list(itertools.product(list(a['test']),list(b['text']))),columns=['test','text'])
>>>df
test text
0 abc uvw
1 abc xyz
2 def uvw
3 def xyz
4 ghi uvw
5 ghi xyz
我无法理解的是,如何将相关的id列也输入到我的数据帧中,使其看起来像:
>>>df
id test text kid
0 1 abc uvw 11
1 1 abc xyz 22
2 2 def uvw 11
3 2 def xyz 22
4 3 ghi uvw 11
5 3 ghi xyz 22
我尝试分别在id列上进行组合
df1 =pd.DataFrame(list(itertools.product(list(a['id']),list(a['id']))),columns=['id','id'])
df
id id
0 1 1
1 1 2
2 1 3
3 2 1
4 2 2
5 2 3
6 3 1
7 3 2
8 3 3
df2 =pd.DataFrame(list(itertools.product(list(b['kid']),list(b['kid']))),columns=['kid','kid'])
>>>df2
id kid
0 11 11
1 11 22
2 22 11
3 22 22
然后我试着把它连接起来。这显然失败了
df = pd.concat([df['id'],df2,df1['kid']],axis=1)
>>> df
id test text kid
0 1 abc uvw 11.0
1 1 abc xyz 22.0
2 1 def uvw 11.0
3 2 def xyz 22.0
4 2 ghi uvw NaN
5 2 ghi xyz NaN
6 3 NaN NaN NaN
7 3 NaN NaN NaN
8 3 NaN NaN NaN
我有一种感觉,我可能可以使用数据帧的
apply
功能来解决这个问题,但我就是不知道如何解决。任何线索将不胜感激。感谢您阅读了这么多:)您可以使用具有相同常量的交叉连接和新帮助程序列:
first_df['tmp'] = 1
second_df['tmp'] = 1
df = pd.merge(first_df, second_df.rename(columns={'id':'kid'}), on='tmp').drop('tmp',1)
print (df)
id test kid text
0 1 abc 11 uvw
1 1 abc 22 xyz
2 2 def 11 uvw
3 2 def 22 xyz
4 3 ghi 11 uvw
5 3 ghi 22 xyz
用于新列的单线解决方案:
df = pd.merge(first_df.assign(tmp=1),
second_df.assign(tmp=1).rename(columns={'id':'kid'}), on='tmp').drop('tmp',1)
print (df)
id test kid text
0 1 abc 11 uvw
1 1 abc 22 xyz
2 2 def 11 uvw
3 2 def 22 xyz
4 3 ghi 11 uvw
5 3 ghi 22 xyz
哦!哇!这意味着我不必使用我现在正在处理的所有过程?我想不,交叉连接是您需要的。如果我有多个列,这也可以吗?除了我现在拥有的那些?是的,我认为如果需要将一个df中的所有行与第二个df中的所有行组合起来,它也可以与多个列一起工作。使用
assign
将我替换为一行!但是,对于非常大的数据集,OP要小心交叉连接,因为您将返回两个数据帧的A x B值。