嗨,我有两个数据帧。两者都有两列,标识符和重量。
我想要的是,对于每个“键”,所以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上的新列,如果它们具有相反的符号,则两个权重列之间的绝对值最低
答案 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