我有两个数据帧df1和df2,其中key
为索引。
dict_1={'key':[1,1,1,2,2,3], 'col1':['a1','b1','c1','d1','e1','f1']}
df1 = pd.DataFrame(dict_1).set_index('key')
dict_2={'key':[1,1,2], 'col2':['a2','b2','c2']}
df2 = pd.DataFrame(dict_2).set_index('key')
DF1:
col1
key
1 a1
1 b1
1 c1
2 d1
2 e1
3 f1
DF2
col2
key
1 a2
1 b2
2 c2
请注意,每个索引都有不相等的行。我想连接这两个数据帧,以便我有以下数据帧(比如说df3)。
DF3
col1 col2
key
1 a1 a2
1 b1 b2
2 d1 c2
即。连接两列,使新数据帧成为每个索引的最小(df1和df2)行。
我试过
pd.concat([df1,df2],axis=1)
但是我收到以下错误:
Value Error: Shape of passed values is (2,17), indices imply (2,7)
我的问题:如何连接df1
和df2
以获取df3
?我应该使用DataFrame.merge
吗?如果是这样,怎么样?
答案 0 :(得分:1)
单独合并/加入会让你获得很多(很难摆脱)重复。但是一个小技巧会有所帮助:
df1['count1'] = 1
df1['count1'] = df1['count1'].groupby(df1.index).cumsum()
df1
Out[198]:
col1 count1
key
1 a1 1
1 b1 2
1 c1 3
2 d1 1
2 e1 2
3 f1 1
df2
同样的事情:
df2['count2'] = 1
df2['count2'] = df2['count2'].groupby(df2.index).cumsum()
最后:
df_aligned = df1.reset_index().merge(df2.reset_index(), left_on = ['key','count1'], right_on = ['key', 'count2'])
df_aligned
Out[199]:
key col1 count1 col2 count2
0 1 a1 1 a2 1
1 1 b1 2 b2 2
2 2 d1 1 c2 1
现在,您可以使用set_index('key')
重置索引,并删除不再需要的列countn
。
答案 1 :(得分:0)
为什么你不能以你想要的方式排列这两个问题的最大问题是你的密钥是重复的。你如何将df1
中的A1值与df2
中的A2值对齐当A1,A2,B1,B2和C1都具有相同的键时?
如果您可以解决关键问题,则可以使用merge:
df3 = df1.merge(df2, left_index=True, right_index=True, how='inner')
您可以将inner
,outer
,left
或right
用于how
。