Python 如果其他列具有相同的值,则减去两个df列
我是巨蟒和熊猫的新手。 寻找两个不同df列之间的减法帮助 样本数据Python 如果其他列具有相同的值,则减去两个df列,python,pandas,Python,Pandas,我是巨蟒和熊猫的新手。 寻找两个不同df列之间的减法帮助 样本数据 df1 = pd.DataFrame({'label1': ['lab1', 'lab2', 'lab3', 'lab4'], 'compare1': [10, 20, 30, 40], 'col3': [100, 50, -30, -50]}) df2 = pd.DataFrame({'lable1': ['lab1', 'lab2', 'lab4'
df1 = pd.DataFrame({'label1': ['lab1', 'lab2', 'lab3', 'lab4'],
'compare1': [10, 20, 30, 40],
'col3': [100, 50, -30, -50]})
df2 = pd.DataFrame({'lable1': ['lab1', 'lab2', 'lab4', 'lab5'],
'compare1': [80,10, 40, 50],
'col3': [200, 60, 30, 50]})
df_diff = pd.DataFrame({'label': ['lab1', 'lab2', 'lab4', 'lab3', 'lab5'],
'df1_compare1': [10, 20, 40, 30, 0],
'df2_compare1': [80,10, 40, 0, 50],
'compare': [-70, 10, 0, 30, 50]})
两个dfs的列名和计数相同
如果label1和label2的值相同,则需要df1.compare1和df2.compare2之间的减法(或其他数学运算)帮助
例如,lab1、lab2和Lab4(尽管Lab4位于不同的行上)具有相同的标签值。两个df中不相同的任何行都应显示在df的底部,并带有原始值,而其他列数据显示为0
实际数据的大小以CSV/excel MB为单位,如果可能,请寻找性能有效的方法
非空对象是否对性能有影响??这是标签上的列类型。首先在列标签上创建数据帧
最后,通过减去compare1-compare2
,创建compare
列:
df_diff = df1[['label1', 'compare1']].merge(df2[['label1', 'compare1']],
on='label1',
how='outer',
suffixes=['_df1', '_df2'])
df_diff['compare'] = df_diff['compare1_df1'].fillna(0) - df_diff['compare1_df2'].fillna(0)
如果您有20分钟的时间,这里有一本关于合并
工作原理的好书:为什么在df_diff
40中最后一次比较?应该是-50吗?同意。改变madeIt应该是-50 btw,遵循第一行的逻辑,使用-70no。如果找不到col1值,则需要保持原始值不变(无任何操作)。感谢Erfan,您的解决方案按预期工作。如果我的两个df中的列名都相同怎么办?我更新了问题中的数据,使之更容易,因为我们只需在
参数上使用,而不必在
上使用left\u和right\u,现在我们可以使用后缀
参数为列指定df1
和df2
作为后缀。请参见编辑后的答案@annoThanks-Erfan。它正在按预期工作。对绩效有何建议??您对绩效有任何问题吗?在速度方面,这应该是相当有效的。Memorywise数据可能会变得相当大,因为我们正在执行一个outer
连接,以保持两个数据帧中的所有行。但这是我们必须使用的,因为这是你在问题中定义的关系@如果这对你有帮助,别忘了接受答案:)@ann
label1 compare1_df1 compare1_df2 compare
0 lab1 10.0 80.0 -70.0
1 lab2 20.0 10.0 10.0
2 lab3 30.0 NaN 30.0
3 lab4 40.0 40.0 0.0
4 lab5 NaN 50.0 -50.0