Python 两个数据帧之间的相减
DFOne DFTwo 我需要从DFTwo中的每个值中减去DFOne.NumberValueCol1,直到得到最小的差值 第一次迭代将从DFTwo中的每个值中减去DFOne.NumberValueCol1--10,这将导致 ID结果(DFOne.NumberValueCol1,每个DFTwo.NumberValueCol2值10个值) 在本例中,ID3--DFTwo.NumberValueCol2(9)产生最小的差值1。所以我想把这个值映射到 DFOne.NumberValueCol1--10 第二次迭代将从ID2,DFOne.NumberValueCol1值11开始。但是,不是开始减法 从DFTwo.NumberValueCol2开始,它将从存在匹配点的下一个可用ID开始。 因此,由于有一个ID为3的匹配,下一个起点将是ID为4,它将与第一个逻辑相同,以获得最小的差异Python 两个数据帧之间的相减,python,pandas,dataframe,Python,Pandas,Dataframe,DFOne DFTwo 我需要从DFTwo中的每个值中减去DFOne.NumberValueCol1,直到得到最小的差值 第一次迭代将从DFTwo中的每个值中减去DFOne.NumberValueCol1--10,这将导致 ID结果(DFOne.NumberValueCol1,每个DFTwo.NumberValueCol2值10个值) 在本例中,ID3--DFTwo.NumberValueCol2(9)产生最小的差值1。所以我想把这个值映射到 DFOne.NumberValueCol1--10
我希望这不会太令人困惑。我来自t-sql世界,因此我试图了解如何使用Pandas而不是传统的sql server游标进行此类计算。您的问题总结如下:
1. Result - 5
2. Result - 3
3. Result - 1
4. Result - 4
5. Result - 7
然而,我们在这里遇到了DFTwo最终为零的问题
表面上,这在您的实际用例中不会是一个问题,因为DFTwo足够大,可以支持这种切片吗?没有关于实际业务逻辑的更多信息,这是我最好的尝试。您的问题总结如下:
1. Result - 5
2. Result - 3
3. Result - 1
4. Result - 4
5. Result - 7
然而,我们在这里遇到了DFTwo最终为零的问题
表面上,这在您的实际用例中不会是一个问题,因为DFTwo足够大,可以支持这种切片吗?如果没有关于实际业务逻辑的更多信息,这是我最好的尝试。发布最终预期结果post最终预期结果步骤为:1。DFOne第一个值,从DFTO2中减去。匹配两个3中最小的结果。转到DFOne的下一条记录并重新开始最终结果集应包含所有匹配项。它不能是DFTwo的最大值,因为下一个DFOne记录可能与以前的值匹配。最终的结果是,ID来自DFTwo ID 3,结果1(这是10个DfOne值-9个DFWO值)ID 4,结果5(这是11个DfOne值-6个DFWO值)“它不可能是DFWO的最大值,因为下一个DfOne记录可能与以前的值匹配”------什么?如果你想要一组差值(x1-x2)中的最小值,其中第一个值(x1)是常数,那么你可以简单地使用x2最大的一对。我已经更改了代码,以更好地反映你原来的问题,请查看并让我知道这是否更接近你的期望。Hi Konchshell,感谢你回答我的问题。根据我在这篇帖子中给出的要求,是的,你的回答可以让我有一个正确的开始。我的商业用例有点不同,我试着在我的帖子中使用泛型。再次感谢你的帖子!步骤如下:1。DFOne第一个值,从DFTO2中减去。匹配两个3中最小的结果。转到DFOne的下一条记录并重新开始最终结果集应包含所有匹配项。它不能是DFTwo的最大值,因为下一个DFOne记录可能与以前的值匹配。最终的结果是,ID来自DFTwo ID 3,结果1(这是10个DfOne值-9个DFWO值)ID 4,结果5(这是11个DfOne值-6个DFWO值)“它不可能是DFWO的最大值,因为下一个DfOne记录可能与以前的值匹配”------什么?如果你想要一组差值(x1-x2)中的最小值,其中第一个值(x1)是常数,那么你可以简单地使用x2最大的一对。我已经更改了代码,以更好地反映你原来的问题,请查看并让我知道这是否更接近你的期望。Hi Konchshell,感谢你回答我的问题。根据我在这篇帖子中给出的要求,是的,你的回答可以让我有一个正确的开始。我的商业用例有点不同,我试着在我的帖子中使用泛型。再次感谢你的帖子!
1. Result - 5
2. Result - 3
3. Result - 1
4. Result - 4
5. Result - 7
import pandas as pd
df1 = {'id': [1,2,3,4,5], 'value': [10,11,20,13,15]}
df2 = {'id': [1,2,3,4,5], 'value': [5,7,9,6,3]}
df1 = pd.DataFrame(data=df1)
df2 = pd.DataFrame(data=df2)
print("DFTwo")
print(df2)
print('\n')
min_index = 0
df_output = []
for i in df1['value']:
try:
new_val = i - max(df2['value'])
max_index = int(df2['id'][df2['value'] == max(df2['value'])].values)
df2 = df2.iloc[max_index:,]
df_output.append( (max_index, new_val) )
except:
break
print("Output")
print(pd.DataFrame(df_output, columns = ['id','result']))
2 -- 1
id value
3 4 6
4 5 3
0 -- 5
id value
4 5 3
0 -- 17
Empty DataFrame
Columns: [id, value]
Index: []
Traceback (most recent call last):
File "C:/Users/Tyler/Desktop/pd_test.py", line 11, in <module>
new_val = i - max(df2['value'])
ValueError: max() arg is an empty sequence
DFTwo
id value
0 1 5
1 2 7
2 3 9
3 4 6
4 5 3
Output
id result
0 3 1
1 4 5