首页 > 解决方案 > 如果多个匹配“on”并保持匹配直到某一点,则合并而不丢失行并且不重复?

问题描述

所以这就是我想要做的:

df1
        symbol   qty    
 0      DA       400
 1      IND      30
 2      FY       1200    
 3      SHTV     8    
 4      HIN      40    
 5      NM       8    
 6      GRI      400    
 7      PN       7000

df2
tsym symbol quantity
PN35  PN    -3500
FY10  FY    -100
FY15  FY    -300
PN34  PN    -3500

当我合并它们时

posdf1 = pd.merge(df2,df1,how='outer',on='symbol')

我得到的输出:

posdf1
tsym symbol quantity qty
PN35  PN    -3500    7000
FY10  FY    -100     1200
FY15  FY    -300     1200
PN34  PN    -3500    7000

我正在尝试找到一种方法来获得以下输出 2 种类型的输出:

posdf1
tsym symbol quantity qty
PN35  PN    -3500    3500
FY10  FY    -100     100
FY15  FY    -300     300
PN34  PN    -3500    3500

第二种情况如果:

df2
tsym symbol quantity
PN35  PN    -7000
FY10  FY    -1200
FY15  FY    -1200
PN34  PN    -7000

然后是所需的输出:

posdf1
tsym symbol quantity qty
PN35  PN    -7000    7000
FY10  FY    -1200    1200
FY15  FY    -300     NaN
PN34  PN    -7000    NaN

我可以遍历数据框并得到我认为的上述结果。我只是想弄清楚这里是否可以使用merge或其他一些技巧。pandas

提前致谢

标签: pythonpandas

解决方案


因此,看起来您描述的两个用例都没有使用来自的数据df1。给定数据框

df2=pd.DataFrame({'tsym':['PN35','FY10','FY15','PN34'],
                 'symbol':['pn','fy','fy','pn'], 
                 'quantity':[-3500,-100,-300,-3500]})

    tsym    symbol  quantity
0   PN35    pn      -3500
1   FY10    fy      -100
2   FY15    fy      -300
3   PN34    pn      -3500

对于第一种情况:

df2['qty']=df2['quantity'].abs()

    tsym    symbol  quantity qty
0   PN35    pn      -3500    3500
1   FY10    fy      -100     100
2   FY15    fy      -300     300
3   PN34    pn      -3500    3500

其次,您可以制作一个临时groupby().first()df 并将其合并回原始文件:

df2=pd.DataFrame({'tsym':['PN35','FY10','FY15','PN34'],
                 'symbol':['pn','fy','fy','pn'], 
                 'quantity':[-7000,-1200,-1200,-7000]})

df3=df2.groupby('symbol').first().reset_index()

df3['qty']=df3['quantity'].abs()

df2=df2.merge(df3,how='outer')

df2

    tsym    symbol  quantity    qty
0   PN35    pn      -7000       7000.0
1   FY10    fy      -1200       1200.0
2   FY15    fy      -1200       NaN
3   PN34    pn      -7000       NaN

推荐阅读