Python 用每个索引的不同行连接数据帧
我有两个数据帧df1和df2,索引为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 请注意,每个索引都有不同的
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