熊猫在两个数据框架之间减去

时间:2017-10-30 21:11:29

标签: python pandas dataframe

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

我需要从DFTwo中的每个值中减去DFOne.NumberValueCol1,直到得到最小的差异。

第一次迭代将从DFTwo中的每个值中减去DFOne.NumberValueCol1--10,这将导致

ID结果(DFOne.NumberValueCol1,每个DFTwo.NumberValueCol2值的值为10)

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

在这种情况下,ID 3 - DFTwo.NumberValueCol2(9),产生最小的差值1.所以我想将此值映射到 DFOne.NumberValueCol1 - 10.

第二次迭代将以ID 2,DFOne.NumberValueCol1值11开始。但是,不是开始减法 从DFTwo.NumberValueCol2的开头,它将从匹配的点开始下一个可用的ID。 因此,由于与ID 3匹配,下一个起始点将是ID 4,并且它将与第一个逻辑相同,以获得最小的差异

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

1 个答案:

答案 0 :(得分:0)

您的问题归纳为:

  1. 在DFTwo中找到最大值,从DFOne中的第一个值中减去该值。
  2. 使用DFTwo中最大值的索引,从该索引向前切片DFTwo。
  3. 使用第二行DFone转到步骤1。
  4. 一个工作示例:

    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足以支持这种切片?如果没有关于实际业务逻辑的更多信息,这是我最好的尝试。