如何在python中从一个数据帧的列减去另一个数据框的列,并将结果和两列存储在一个新的数据帧中



我有两个数据帧,其中一个公共列"X"具有所有唯一值。我想把数据帧1的每一列减去具有相似名称的数据帧2的每一行。数据帧1

>td style="text-align:left;">1235
X
A1 48.0
A2

是的,您可以在列"X〃;要创建一个包含所有值的数据帧,请遍历列并将计算出的数据帧附加到列表中。

类似于:

df = pd.merge(left=df1, right=df2, on='X', how='inner')
output_frames = []
letters = [i[-1] for i in df.columns if not i == 'X'] #Get letters in your columns 
letters = list(set(letters)) #Get list of letters with single element
for letter in letters:
newdf = df.loc[:, ['X'] + [i for i in df.columns if i.endswith(letter)]]
newdf['Difference'] = newdf[f'par {letter}'] - newdf[f'bar {letter}']
newdf['Status'] = newdf.apply(lambda x: 'OK' if x.Difference >= 0 else 'NOT OK', axis=1)
output_frames.append(newdf)

然后查看输出:

for df in newdf:
print(df)

或者更好的是,合并输出:

df = pd.concat(output_frames, axis=1)  

您期望的输出和逻辑有点不明确,我在这里假设您想要减去df2中与df1中的列具有相同尾随字母的列。如果所有差异均为正,则计算状态:

df3 = df1.merge(df2, on='X').set_index('X')
(df3.groupby(df3.columns.map(lambda x: x.split()[1]), axis=1)
.apply(lambda d: d.diff(axis=1).iloc[:,-1])
.add_prefix('diff_')
.assign(Status=lambda d: np.where(d.ge(0).all(1), 'OK', 'Not OK'))
)

输出:

diff_A  diff_B Status
X                         
A1     15.0  5296.0     OK
A2     21.0  3775.0     OK

最新更新