Python 用每个索引的不同行连接数据帧

Python 用每个索引的不同行连接数据帧,python,pandas,dataframe,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: df2 请注意,每个索引都有不同的

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

df2

请注意,每个索引都有不同的行。我想连接这两个数据帧,这样我就有了下面的数据帧(比如df3)

df3

i、 e.连接两列,使新数据帧成为每个索引的最少(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
吗?如果是这样,怎么做?

为什么不能按您想要的方式排列这两个键的最大问题是,您的键是重复的。当A1、A2、B1、B2和C1都具有相同的键时,如何将
df1
中的A1值与
df2
中的A2值对齐

如果您能够解决关键问题,那么您需要使用:

df3 = df1.merge(df2, left_index=True, right_index=True, how='inner')

您可以使用
内部
外部
左侧
右侧
,了解
如何

仅合并/加入就可以获得大量(难以消除的)重复项。但一个小技巧会有所帮助:

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

感谢您的“小技巧”。这是我无法理解的缺失环节。我接受这个答案。@Bhushan很高兴我能帮忙。复制键是数据帧的一部分。下面是更大的上下文:“id1”是缓冲区id的索引[比如:0到255],而“col1”和“col2”是获取和释放缓冲区时的时间戳。缓冲区将在一个大的时间窗口内获取/释放,ptrj的回答帮助我重新排序数据帧,以便我可以计算缓冲区使用的持续时间。
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['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