我有两个数据帧 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 来代替吗?如果是这样,怎么办?
最佳答案
单独合并/连接会给你带来很多(难以消除的)重复项。但一个小技巧会有所帮助:
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
。
关于python - 将 pandas 数据框与每个索引的不同行连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37219617/