Python Pandas Dataframe - 计算行之间的差异并采用最小值

时间:2018-01-14 21:39:20

标签: python pandas dataframe

我有一个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

1 个答案:

答案 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