两个数据帧之间的相减

2024-10-01 07:45:11 发布

您现在位置:Python中文网/ 问答频道 /正文

DFOne公司

 1. ID-1  NumberValueCol1- 10 
 2. ID-2  NumberValueCol1--11
 3. ID-3  NumberValueCol1--20
 4. ID-4  NumberValueCol1--13
 5. ID-5  NumberValueCol1--15

DFTwo公司

 1. ID-1  NumberValueCol1- 5
 2. ID-2  NumberValueCol1--7
 3. ID-3  NumberValueCol1--9
 4. ID-4  NumberValueCol1--6
 5. ID-5  NumberValueCol1--3

我需要减法DFOne.numberValue列1从DFTwo中的每个值开始,直到得到最小的差值。你知道吗

第一次迭代将减去DFOne.numberValue列1--10,从DFTwo中的每个值

ID结果(DFOne.numberValue列1,每个值10DFTwo.NumberValueCol2编号值)

 1. Result - 5
 2. Result - 3
 3. Result - 1
 4. Result - 4
 5. Result - 7

在这种情况下,ID 3--DFTwo.NumberValueCol2编号(9) ,得到最小差值1。所以我想把这个值映射到 DFOne.numberValue列1-- 10. 你知道吗

第二次迭代从ID 2开始,DFOne.numberValue列1值11。但是,不是开始减法 从一开始DFTwo.NumberValueCol2编号,它将从存在匹配点的下一个可用ID开始。 因此,既然有一个与id3匹配的,那么下一个起点将是id4,它将与第一个逻辑相同,以获得最小的差异

我希望这不会太混乱。我来自t-sql世界,所以我试图理解如何使用Pandas而不是传统的sqlserver游标来进行这种类型的计算。你知道吗


Tags: id情况公司逻辑result编号起点id3
1条回答
网友
1楼 · 发布于 2024-10-01 07:45:11

您的问题概括为:

  1. 找到DFTwo中的最大值,从DFOne中的第一个值中减去它。你知道吗
  2. 使用DFTwo中最大值的索引,从该索引开始切片DFTwo。你知道吗
  3. 转到步骤1,使用第二行DFone。你知道吗

一个有效的例子:

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']))

然而,我们在这里遇到的问题是DFTwo最终是nil。你知道吗

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

带有新except子句的输出:

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

表面上看,这在您的实际用例中不会是一个问题,因为DFTwo足够大,可以支持这种切片吗?没有更多关于实际业务逻辑的信息,这是我最好的尝试。你知道吗

相关问题 更多 >