我是 numpy 的初學者,我有兩個如下所示的 csv 檔案:
檔案 1:
| ID | item_size | 成本 |
|---|---|---|
| 0010 | 4.4 | |
| 0010 | 5.5 | |
| 0012 | 8個 | |
| 0012 | 10.1 |
格式檔案 2:
| ID | item_size | 成本 |
|---|---|---|
| 0010 | 6.1 | 5個 |
| 0010 | 7.2 | 2個 |
| 0010 | 5.3 | 1個 |
| 0010 | 3.1 | 3個 |
| 0010 | 4.7 | 2個 |
| 0012 | 7.6 | 5個 |
| 0012 | 22 | 4個 |
| 0012 | 13.1 | 2個 |
| 0012 | 9.2 | 3個 |
| 0012 | 11.1 | 3個 |
輸出應如下所示:csv_output:
| ID | item_size | 成本 |
|---|---|---|
| 0010 | 4.4 | 2個 |
| 0010 | 5.5 | 1個 |
| 0012 | 8個 | 5個 |
| 0012 | 10.1 | 3個 |
“4.4 的 item_size 最接近的值是 4.7,它們也有相同的 ID,因此 Cost 列填充了 2。”
任務是匹配 csv1 和 csv2 之間的 ID。還要獲得最接近的物品尺寸并增加成本。維護 csv1 作為輸出 csv。
所以我必須根據 csv1 和 csv2 之間最接近的 item_size 值來填充 csv1 的缺失成本。此外,它們必須屬于同一個 ID。我嘗試將這個問題分成幾個任務,例如:最近值問題、相似 ID 問題和填充成本問題。然后,將它們全部結合起來。
我已經解決了最近值問題。使用這個腳本:
import numpy as np
def closest_value(input_list, input_value):
arr = np.asarray(input_list)
i = (np.abs(arr - input_value)).argmin()
return arr[i]
list1 = dataset_1['item_size'].values.tolist()
list2 = dataset_2['item_size'].values.tolist()
for i in range(len(list2)):
val=closest_value(list1,list2[i])
print("The closest value to the " str(list[i]) " is",val)
我還嘗試使用以下方法解決類似的 ID 問題:
import pandas as pd
csv1 = pd.read_csv('csv1.csv')
csv2= pd.read_csv('csv2.csv')
csv2[csv2['ID'].duplicated(keep=False)]
csv2.groupby('ID',axis=0).apply(lambda x: x.to_csv(str(x.name) '.csv'))
但是,此方法基于 ID 相似性創建 csv 檔案,計算量太大。如果有其他方法可以解決這個問題,我會很樂意接受。我一直在嘗試解決這個問題至少 5 天,因此我們將不勝感激。此致
uj5u.com熱心網友回復:
您可以使用merge_asof:
# save the index to restore it later
# sort the data for the merge_asof (required)
(pd.merge_asof(df1.reset_index().sort_values(by='item_size').drop(columns='Cost'),
df2.sort_values(by='item_size'),
by='ID', on='item_size', direction='nearest'
)
.set_index('index').sort_index() # restore original order
)
輸出:
ID item_size Cost
index
0 10 4.4 2
1 10 5.5 1
2 12 8.0 5
3 12 10.1 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/533402.html
