连接pandas数据帧,每个索引具有不同的行

时间:2016-05-13 21:29:40

标签: python pandas dataframe

我有两个数据帧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)

我的问题:如何连接df1df2以获取df3?我应该使用DataFrame.merge吗?如果是这样,怎么样?

2 个答案:

答案 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')

您可以将innerouterleftright用于how

相关问题