python - 将 pandas 数据框与每个索引的不同行连接起来

标签 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 来代替吗?如果是这样,怎么办?

最佳答案

单独合并/连接会给你带来很多(难以消除的)重复项。但一个小技巧会有所帮助:

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/

相关文章:

python - 如何有条件地计算累计值?

python - 保留满足条件的行和相邻行

Python:数据参数不能是迭代器

python - 如何将保存为 RData 的数据框从 R 导入到 pandas?

python - 没有运行时错误,但虹膜 PCA 绘图错误

javascript - 在 Python 和 Javascript 中使用 Selenium 在 Quora 上无限滚动

python - 使用 Python 的 Fabric 库对 "execute"进行嵌套调用

python - 如何在 Django 中创建装饰器来装饰 View

scala - 从 Spark DataFrame 中的单个列派生多个列

python - 将 pandas 数据帧索引转换为基于数据帧值,同时将值更改为 bool 值