簡體   English   中英

在兩個數據框之間減去熊貓

[英]Pandas Subtracting between two Data Frames

東風一號

 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

東風2

 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,每個10個值DFTwo.NumberValueCol2值)

 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. 在DFTwo中找到最大值,然后從DFOne中的第一個值中減去該最大值。
  2. 使用DFTwo中最大值的索引,從該索引開始對DFTwo進行切片。
  3. 使用DFone的第二行轉到步驟1。

一個工作示例:

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足夠大以支持此切片? 如果沒有更多有關實際業務邏輯的信息,這是我的最佳嘗試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM