Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果其他列具有相同的值,则减去两个df列_Python_Pandas - Fatal编程技术网

Python 如果其他列具有相同的值,则减去两个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'

我是巨蟒和熊猫的新手。 寻找两个不同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', '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