我有一个Pandas Dataframe
D
存储一个大型数据库。我还有一个较小的DataFrame
C
,有10行,包含与主要列完全相同的列,包括列“price
”。对于主数据框r
中的每一行D
,我想在t
中找到最接近的行C
,即r.price
和{之间的差异{1}}很少。
作为我想要的输出:
我有一个计算差异的函数
t.price
我想使用apply函数将差异函数应用于C中的每一行,对于D中的每一行v:
def difference(self, row1, row2):
d = np.abs(row1["price"] - row2["price"])
return d
但我不知道如何找到差异极小的for _, v in D.iterrows():
C.apply(self.difference, axis=1, args=(v,))
行。我正在考虑Python中的C
内置函数,但我不知道如何正确地为数据帧应用它。
一个例子: 假设我有数据D
min
和C(为简单起见,只有5行),如下所示
id | name | price
1. bdb | AAA | 2.34
2. 441 | BBB | 3.56
3. ae9 | CCC | 1.27
4. fb9 | DDD | 9.78
5. e6b | EEE | 5.13
6. bx4 | FFF | 6.23
7. a9a | GGG | 9.56
8. 847 | HHH | 9.23
9. e4c | III | 0.45
...
200. eb3 | XYZ | 10.34
因此,我的函数输出应该如下:
id | name | price
1. xyh | AA1 | 0.34
2. y5h | BB1 | 9.77
3. af6 | CC1 | 3.24
4. op9 | DD1 | 6.34
5. 23h | EE1 | 0.20
答案 0 :(得分:1)
使用np.searchsorted
索引到C.price
的排序版本。
p1 = D.price.values
v = np.sort(C.price.values)
p2 = v[np.searchsorted(v, p1) - 1]
p2
array([ 0.34, 3.24, 0.34, 9.77, 3.24, 3.24, 6.34, 6.34, 0.34])
现在,从p2
中减去p1
。
pd.Series(p1 - p2)
0 2.00
1 0.32
2 0.93
3 0.01
4 1.89
5 2.99
6 3.22
7 2.89
8 0.11
dtype: float64