比较基于pandas中公共密钥的值

时间:2018-03-09 16:40:56

标签: python pandas dataframe

嗨,我有两个数据帧。两者都有两列,标识符和重量。

我想要的是,对于每个“键”,所以A和B,如果第二列在两个数据帧上具有相反的符号(因此一个是正数而一个是负数,那么创建一个具有最低绝对值的新列)。

    import pandas as pd
    A = {"ID":["A", "B"], "Weight":[500,300]}
    B = {"ID":["A", "B"], "Weight":[-300,100]}

    dfA = pd.DataFrame(data=A)
    dfB = pd.DataFrame(data=B)

    dfC = dfA.merge(dfB, how='outer', left_on=['ID'], right_on=['ID'])

因此预期输出将是dfC上的新列,如果它们具有相反的符号,则两个权重列之间的绝对值最低

3 个答案:

答案 0 :(得分:0)

首先,计算两个数据帧的绝对最低权重,然后通过比较符号,使用np.where创建一个新的数据框。

v = np.minimum(dfA['Weight'].abs(), dfB['Weight'].abs()) # pairwise minimum, reference @jpp
dfC = dfA.assign(
    newWeight=np.where(np.sign(dfA['Weight']) != np.sign(dfB['Weight']), v, 0))

dfC

  ID  Weight  newWeight
0  A     500        300
1  B     300          0

答案 1 :(得分:0)

这是另一种获得所需结果的方法,使用df.apply和df.concat
第1步:使用ID,WeightA和WeightB创建dfC

import numpy as np
A = dfA.set_index('ID')
B = dfB.set_index('ID')
dfC = pd.concat([A,B], 1).reset_index()
dfC.columns = ['ID', 'WeightA', 'WeightB']

编辑: 您也可以使用dfC,只需重命名列,然后使用Step2获得结果。

dfC = dfA.merge(dfB, how='outer', left_on=['ID'], right_on=['ID'])
dfC.columns = ['ID', 'WeightA', 'WeightB']

步骤2:创建列'lowestAbsWeight',这是两个权重A和B的最低绝对值

dfC['lowestAbsWeight'] = dfC.apply(lambda row: np.absolute(row['WeightA']) if np.absolute(row['WeightA'])<np.absolute(row['WeightB'] )  else np.absolute(row['WeightB']), axis=1  )

输出如下:

    ID  WeightA WeightB lowestAbsWeight
0   A   500     -300          300
1   B   300      100          100

希望这有帮助。

答案 2 :(得分:0)

以下是通过.loc访问者的一种方式:

import pandas as pd

dfA = dfA.set_index('ID')
dfB = dfB.set_index('ID')

dfC = dfA.copy()
dfC['Result'] = 0

mask = (dfA['Weight'] > 0) != (dfB['Weight'] > 0)

dfC.loc[mask, 'Result'] = np.minimum(dfA['Weight'].abs(), dfB['Weight'].abs())

dfC = dfC.reset_index()

#   ID  Weight  Result
# 0  A     500     300
# 1  B     300       0